歸併:穩定,o(nlogn),遞迴實現
大類排序方法
時間複雜度
空間複雜度
穩定性實現方法
備註交換法
冒泡法最差、平均都是o(n^2),最好是o(n)1穩定
√n較小時較好
交換法雞尾酒冒泡法
最差、平均都是o(n^2),最好是o(n)1穩定
√n較小時較好
交換法快速排序
平均o(nlogn),最壞是o(n^2)
o(logn)
不穩定√
n大時較好
插入法直接插入法
最差、平均都是o(n^2),最好是o(n)1穩定
√大部分已排序時較好
插入法折半插入法
最差、平均都是o(n^2)1穩定
cuo大部分已排序時較好
插入法希爾排序(分組的插入法)
平均是o(nlogn)
1不穩定
cuo選擇法
普通選擇
最差、平均都是o(n^2)
1不穩定
√n較小時較好
選擇法堆排序
最差、平均、最好都是o(nlogn)
1不穩定
√n大時較好
歸併排序
歸併排序
最差、平均、最好都是o(nlogn)
o(n)穩定√
n大時較好
基數排序
基數排序
o(n)(d是常數)
o(n)穩定√
折半插入,希爾排序插入:鍊錶不支援隨機訪問元素,指標需要長距離移動,每次都要逐個遍歷效率實在很慢
快速排序:指標不需要長距離移動,但需要前後向中間移動,可使用雙向鍊錶實現,
typedef struct a node, *pnode;
穩定:相同關鍵字在排序後相對位置不變
快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序演算法。
基於關鍵字交換的簡單選擇排序:if(arr[k]>arr[j]) k=j;尋找最小值,與第乙個交換(兩個相同值之間沒有比較)–不穩定
舉個例子,序列3 8 3 2 9, 我們知道第一遍選擇第1個元素3會和2交換,那麼原序列中2個3的相對前後順序就被破壞了
基於關鍵字插入的簡單選擇排序:鏈式:if(p->data > q->data) p=q;/p指向最小的關鍵字/然後插到無序序列的前邊,如果不判斷是否有序,直接插入一樣不穩定
快速排序的一次劃分的過程是(在高低指標不相遇的條件下)的左右交換
分手時不知你的去處,也沒有說我和你何時再相會(一般的,一次劃分一定會劃分到同一邊,但是相對位置是不確定的)
肯定是不穩定的
本來應該相遇的兩個數,因為間隔的劃分進入了不同的世界,是不穩定的
while
(i
排序比較與總結
之前一共實現了6種比較常見的排序演算法,分別是 選擇排序,插入排序,氣泡排序,歸併排序,快速排序,堆排序 效率 衡量乙個演算法的效率包括空間和時間,有時候還要考慮穩定性。前3種排序的方法效率較低,實現也比較簡單,適合規模比較小的排序,個人認為適合排序總量在10000以下的隨機數組。後3種排序的方法效...
演算法 排序演算法的介紹與總結(三)
1 什麼是堆 堆是一種樹結構,更準確的說是完全二叉樹。並且每個非葉節點的資料大於或等於 小於或等於 其左 右子結點的資料,這樣堆結構的根結點為最大值 最小值 堆稱為最大堆 最小堆 所以可以歸納為 堆是乙個完全二叉樹,非葉結點與左右子結點的資料有一定的大小關係。2 什麼是堆排序 完整的堆排序需要經過反...
排序演算法比較總結
每次從頭開始 每次結束可以不到最後,因為上一次已經確定最大值在末尾了 比較相鄰兩個數,每次下沉乙個最大值。123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 3233 3435 36 include usingnames...