在程式設計與演算法領域,排序(Sorting) 是最常見的問題之一。無論是搜尋數據、資料分析,還是優化應用效能,選擇合適的排序演算法都至關重要。
但不同的排序演算法,在不同情境下的效能並不相同,因此我們需要根據**時間複雜度(Time Complexity)**來比較它們的優缺點,並了解在何種情況下應該使用哪種排序方法。
本篇文章將介紹 常見的排序演算法,分析它們的時間複雜度、空間複雜度,以及適用場景,讓你能夠選擇最合適的排序方法!?
1. 常見排序演算法與時間複雜度比較
排序演算法的效率通常以**時間複雜度(Time Complexity)**來衡量,以下是常見的排序方法:
| 演算法 | 最佳情況 | 平均情況 | 最差情況 | 空間複雜度 | 穩定性 |
|---|---|---|---|---|---|
| Bubble Sort(氣泡排序) | O(n) | O(n²) | O(n²) | O(1) | ✅ |
| Selection Sort(選擇排序) | O(n²) | O(n²) | O(n²) | O(1) | ❌ |
| Insertion Sort(插入排序) | O(n) | O(n²) | O(n²) | O(1) | ✅ |
| Merge Sort(合併排序) | O(n log n) | O(n log n) | O(n log n) | O(n) | ✅ |
| Quick Sort(快速排序) | O(n log n) | O(n log n) | O(n²) | O(log n) | ❌ |
| Heap Sort(堆排序) | O(n log n) | O(n log n) | O(n log n) | O(1) | ❌ |
| Counting Sort(計數排序) | O(n + k) | O(n + k) | O(n + k) | O(k) | ✅ |
| Radix Sort(基數排序) | O(nk) | O(nk) | O(nk) | O(n + k) | ✅ |
2. 各排序演算法詳解與分析
1️⃣ 氣泡排序(Bubble Sort)
? 概念:每次遍歷陣列時,將較大的元素「浮動」到正確的位置,類似氣泡上升。
? 時間複雜度:最佳情況 O(n),平均與最差 O(n²)
? 適用場景:當資料量小且幾乎已排序時(但通常不推薦使用)
範例程式碼(C++):
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
2️⃣ 選擇排序(Selection Sort)
? 概念:每次從未排序的部分選出最小的元素,放到正確位置。
? 時間複雜度:O(n²)(無論數據是否已排序)
? 適用場景:適用於記憶體受限的場景(例如嵌入式系統)
3️⃣ 插入排序(Insertion Sort)
? 概念:將元素插入到前面已排序的部分,使序列保持有序。
? 時間複雜度:O(n)(最佳),O(n²)(最差)
? 適用場景:適用於小型數據集,如排序少量資料或幾乎已排序的陣列
4️⃣ 合併排序(Merge Sort)
? 概念:遞迴地拆分陣列,排序後再合併。
? 時間複雜度:O(n log n)(最佳、平均、最差皆相同)
? 適用場景:適用於大規模數據,尤其是需要穩定排序的場合(如外部排序)
5️⃣ 快速排序(Quick Sort)
? 概念:選擇一個樞軸(Pivot),將數據分為「比樞軸小」與「比樞軸大」的部分,遞迴排序。
? 時間複雜度:O(n log n)(平均),O(n²)(最差,當樞軸選擇不佳時)
? 適用場景:適用於大數據集,通常比 Merge Sort 更快,適合需要高效排序的應用。
6️⃣ 堆排序(Heap Sort)
? 概念:使用最大堆(Max Heap)或最小堆(Min Heap),每次取出最大或最小的元素。
? 時間複雜度:O(n log n)(最佳、平均、最差皆相同)
? 適用場景:適用於即時排序,例如優先佇列(Priority Queue)
7️⃣ 計數排序(Counting Sort)
? 概念:利用計數陣列來計算每個元素出現的次數,然後重新排列數據。
? 時間複雜度:O(n + k)(k 為數據範圍)
? 適用場景:適用於數值範圍小但數量大的場景(如學生分數排序)
8️⃣ 基數排序(Radix Sort)
? 概念:根據數字的位數(個位數、十位數等)逐步排序。
? 時間複雜度:O(nk)(k 為最大數的位數)
? 適用場景:適用於長整數排序(如電話號碼、身份證號)
3. 各排序演算法的應用場景
| 排序演算法 | 適用情境 |
|---|---|
| Bubble Sort | 幾乎已排序的少量資料(但通常不推薦) |
| Selection Sort | 需要原地排序且數據量小(如嵌入式系統) |
| Insertion Sort | 小規模資料、幾乎已排序的資料 |
| Merge Sort | 大規模數據,需保持穩定排序 |
| Quick Sort | 大數據集,追求高效能 |
| Heap Sort | 優先佇列、即時數據排序 |
| Counting Sort | 數值範圍小但數量大的場景 |
| Radix Sort | 大範圍整數(如帳號、身份證號碼) |
4. 結論
不同的排序演算法有不同的特點與適用場景,選擇適合的排序方法,能夠大幅提升程式效能。
? 小型數據集:Insertion Sort
? 大數據集(一般排序):Quick Sort
? 大數據集(穩定排序):Merge Sort
? 優先佇列、即時應用:Heap Sort
你最常使用哪種排序演算法?歡迎留言分享你的經驗!?
評論