排序算法

各種排序算法對比:

類別 算法名稱 思想 平均時間複雜度 最壞時間複雜度 最好時間複雜度 空間複雜度 是否穩定排序
插入排序 直接插入排序 順序把待排序的數據元素取出插入到已排序子集合的適當位置中。子集合的個數從只有一個元素開始逐次增大,直到和集合大小相同排序完畢。 O(n^2) O(n^2) O(n) O(1) 穩定
希爾排序 將待排序的數據元素分爲若干組(按增量分組),對同一個組內的數據用直接插入法排序;小組的個數逐漸減少;當完成了所有數據元素在同一個組內的排序後排序結束。 O(n(logn)^2) (約等於n1.3) O(1) 不穩定(因爲兩個相同的元素可能分到了不同組)
選擇排序 直接選擇排序 從原始數據集合中選取最小的數據元素並將它與原始集合中第一個元素交換位置;然後從不包含第一個位置的餘下的數據集合中選取最小的元素與原始集合中第二個數據元素交換位置…如此重複,直到餘下的數據集合只剩一個元素爲止。 O(n^2) O(n^2) O(n^2) O(1) 不穩定(因爲交換可能會使相同的兩個數據元素的位置發生改變)
從原始數據集合中取出最小的數據元素,將排在該元素前面的記錄依次往後移,再把該元素放入原始集合中的第一個位置;從不包含第一個位置的餘下的數據集合中再取出最小的元素,再將它前面的無序記錄依次後移,然後把該元素放入原始集合中的第二個位置…如此重複,直到餘下的數據集合只剩一個元素爲止。 O(n^2) O(n^2) O(n^2) O(1) 穩定
堆排序(最大堆、最小堆) 基於完全二叉樹的排序。要進行堆排序,首先要創建堆,數組的N個數據元素對應完全二叉樹的N個節點。若爲最大堆排序,則不斷交換父節點和子節點,使得所有的父節點都大於自己的孩子節點,此時根節點爲數組中的最大數據元素,初始最大堆建立完畢。這時將根節點和最後一個葉子節點交換,相當於把最大值放到了數組的末尾,最大堆節點個數減一。然後數組前N-1個數重新參與創建最大堆,選出第大的數(根節點),再與最後一個葉子節點交換,相當於把第二大的數放到了數組倒數第二的位置,最大堆節點個數減一…如此重複,直到最大堆只剩一個元素爲止。(最小堆即所有的父節點小於自己的孩子節點) O(nlogn) O(nlogn) O(nlogn) O(1) 不穩定
交換排序 冒泡排序 循環比較n-1趟:第一趟時,依次比較相鄰元素的值,若a[i]>a[i+1],交換兩個元素,這樣一趟完畢最大的數據元素將會冒泡到數組的最後面。第二趟時,第二大的數據元素會冒泡到數組倒數第二的位置…如此比較n-1輪,數組呈升序排列。 O(n^2) O(n^2) O(n) O(1) 穩定
快速排序 是一種二叉樹結構的排序方法、遞歸算法。從數組任取一個元素(通常取a[low])作爲基準元素,以此爲標準調整其他元素的位置,使得比基準元素小的元素分佈在基準元素的左側,比基準元素大或者相等的元素分佈在基準元素的右側。對於該基準元素劃分的左右兩個子數組,再分別遞歸調用上述過程 ,直到最後子數組只剩一個元素時停止。 O(nlogn) O(n^2) O(nlogn) 最好O(logn) / 最壞O(n) / 平均O(logn) 不穩定
歸併排序 常用的是二路歸併排序。初始時將數組看成是n個長度爲1的有序子數組,將相鄰的子數組兩兩合併,得到n/2個長度爲2的新數組;對這些新的數組再兩兩歸併,如此重複,直到得到一個長度爲n的有序數組爲止。 O(nlogn) O(nlogn) O(nlogn) O(n) 穩定
基數排序 設待排序的數據元素爲n個m位d進制整數(不足m位高位補0),設置d個桶,令編號分別爲0,1,2…,d-1。首先按數字的最低位(即個位)將元素放入相應的桶中,然後按照桶號從小到大和進入桶中數據元素的先後次序收集分配在各桶中的數據元素,這樣完成對數據的第一次排序;對一次基數排序後的數據元素序列再按次低位(即十位)的數值依次放入到相應的桶中,然後按照桶號從小到大和進入桶中數據元素的先後次序收集分配在各桶中的數據元素,完成第二次排序…如此重複,直到完成了第m次基數排序後,就得到了一個有序序列。 O(mn) O(mn) O(mn) O(n) 穩定
桶排序 - - - - - -

*以上logn均是以2爲底。

特點:

希爾排序是直接插入排序的改進版,其按增量排序,爲不穩定排序。
凡是用到了二叉樹結構,時間複雜度一般爲O(nlogn)。
凡是跳躍交換元素,都是不穩定排序。凡是鄰近兩兩交換,一般是穩定排序。
歸併排序:時間複雜度不僅三個都爲O(nlogn),且爲穩定排序,不過空間複雜度相較較高。

適用場景:

(1)直接插入、冒泡、直接選擇的平均時間複雜度均爲O(n^2)。其中,直接插入適合待排記錄個數n較小或記錄關鍵字基本有序的文件。
直接選擇排序移動次數少,適合於待排記錄所含數據項較多,存儲量較大的情況。
(2)快排、堆排、歸併排序的平均時間複雜度均爲O(nlogn)。其中,堆排和歸併排序適合待排記錄n較大的情況,但歸併排序的性能要優於堆排序。
(3)基數排序適合於待排記錄個數n較大,而關鍵字位數d較小的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章