排序演算法總結

2021-05-28 04:56:43 字數 1226 閱讀 8137

1. 簡述

本文主要說明一些常用的內部排序演算法的分類、複雜性和穩定性。主要基於現在的理解和學習,詳細準確的複雜度可以參見維基百科等比較權威的**,對於一些演算法的不同實現,複雜度也不同,這裡給出的複雜度都是相對較好的演算法的複雜度。

2. 分類

3. 複雜性和穩定性

氣泡排序:在已經有序的情況,取得o(n)的複雜度。

快速排序:每次遞迴都是n的複雜度,遞迴次數根據序列有關係,當已經有序的情況下,遞迴n次,時間複雜度為o(n*logn)

插入排序:在已經有序的情況,取得o(n)的複雜度。

希爾排序:最差時間和平均時間都要根據步長陣列來判斷,現在最好演算法的最差時間複雜度,為o(n*logn)。空間主要是步長陣列需要的。一般步長之間不要存在公因子。

插入排序:交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。

堆排序:  堆排序屬於選擇排序,選擇n-1次,每次從堆中選擇乙個,因此最差就是n*logn。最好的時間無法準確估計,基本上也是n*logn這個程度。

歸併排序:這個排序演算法的複雜度與陣列初始化序列無關,歸併次數為logn次,每次複雜度是o(n),因此複雜度都是o(n*logn)

基數排序:k是陣列中,數值的最大位數。對於int來說,使用十進位制的話,k<=10。穩定性來說,基數排序要求每次必須使用穩定排序,否則最終得不到正確結果。所以這裡的穩定是必須的,而不可能存在不穩定的。而其他的排序,比如氣泡排序,可以改寫成不穩定的,這點需要注意。

計數排序:k是陣列中,數值的範圍,即k=max-min+1。對於int來說,最壞的情況為k=2^32,即陣列內包含了最大正數和最小負數。

桶排序:由於桶排序可能有的桶沒有資料,那麼假設n個資料,只被分到了m個桶中,o(n)+o(m*(n/m)*log(n/m))=o(n+n*(logn-logm))=o(n+n*logn-n*logm) =o(n+n*(logn-logm)),當分到的桶越多時,越是接近n。計數排序可以看作桶排序的乙個特例,將桶開的很大,直到能夠保證每個不同的數值都被分到乙個桶中。

4. 參考

維基百科

三種線性排序演算法 計數排序、桶排序與基數排序    

桶排序與基排序    

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...