1. 程式人生 > >各種排序演算法的總結

各種排序演算法的總結

1.時間複雜度

排序方式 時間複雜度 空間複雜度 穩定性 複雜度
平均情況 最好情況 最壞情況  
交換排序 氣泡排序 O(n^{2}) O(n) O(n^{2}) O(1) 穩定 簡單
快速排序 O(nlogn) O(nlogn) O(n^{2}) O(logn) 不穩定 較複雜
插入排序 直接插入 O(n^{2}) O(n) O(n^{2}) O(1) 穩定 簡單
希爾排序 O(n^{1.3})     O(1) 不穩定 較複雜
選擇排序 簡單選擇 O(n^{2}) O(n^{2}) O(n^{2}) O(1) 穩定 簡單
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不穩定 較複雜
歸併排序   O(nlogn) O(nlogn) O(nlogn) O(n) 穩定 較複雜
基數排序              

2.氣泡排序

通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就“沉”到最後面了。重複N次即可以使陣列有序。

改進1:在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷是否要繼續迴圈。

改進2:記錄某次遍歷時最後發生資料交換的位置,這個位置之後的資料顯然已經有序了。因此通過記錄最後發生資料交換的位置就可以確定下次迴圈的範圍了。

3.快速排序
“挖坑填數+分治法”,首先令i =L; j = R; 將a[i]挖出形成第一個坑,稱a[i]為基準數。然後j--由後向前找比基準數小的數,找到後挖出此數填入前一個坑a[i]中,再i++由前向後找比基準數大的數,找到後也挖出此數填到前一個坑a[j]中。重複進行這種“挖坑填數”直到i==j。再將基準數填入a[i]中,這樣i之前的數都比基準數小,i之後的數都比基準數大。因此將陣列分成二部分再分別重複上述步驟就完成了排序。
4.插入排序

每次將一個待排序的資料,跟前面已經有序的序列的數字一一比較找到自己合適的位置,插入到序列中,直到全部資料插入完成。

5.希爾排序

先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的資料進行直接插入排序,因此可以形象的稱希爾排序為“跳著插”
6.選擇排序

陣列分成有序區和無序區,初始時整個陣列都是無序區,然後每次從無序區選一個最小的元素直接放到有序區的最後,直到整個陣列變有序區。