排序集锦(各种排序算法的特点及性能分析)
關于排序,似乎很簡單的很常見的概念,卻蘊含著很多技術,下面是從不同的角度,對排序的總結:
直插希
冒泡快
選擇堆
1 按照排序特性分類
首先按照排序本身的操作特性可以分為下面幾種:
?插入排序
直接插入排序(Insert Sort) O(n^2)(穩定)
折半插入排序(Binary Insert Sort)(不穩定)
希爾排序(Shell Sort)(不穩定)
交換排序
冒泡排序(Bubble Sort) O(n^2)(穩定)
快速排序(Quick Sort)?? O(nlogn)(不穩定)
選擇排序
直接選擇排序(Select Sort) O(n^2)(不穩定)
錦標賽排序(Tournament Sort) O(nlogn)(不穩定)
堆排序(Heap Sort) O(nlogn)(不穩定)
?歸并排序(Merge Sort) O(nlogn)
穩定,還取決與,每段的排序算法選擇。比如每段長度大于2 用穩定的直接插入排序,然后再歸并,不一定要到長度為2 的粒度再歸并。
?基數排序(Radix Sort) O(d(n+radix))(穩定性 待定)
2 每種排序算法的特點:
冒泡排序:在最優情況下只需要經過n- 1次比較即可得出結果,(這個最優情況那就是序列己是正序,從100K的正序結果可以看出結果正是如此),但在最壞情況下,即倒序(或一個較小值在最 后),下沉算法將需要n(n-1)/2次比較。所以一般情況下,特別是在逆序時,它很不理想。它是對數據有序性非常敏感的排序算法。
?
冒泡排序2:它是冒泡排序的改良(一次下沉再一次上浮),最優情況和最壞情況與冒泡排序差不多,但是一般情況下它要好過冒泡排序,它一次下沉,再一次上浮,這樣避免了因一個數的逆序,而造成巨大的比較。如(2,3,4,…,n- 1,n,1),用冒泡排序需要n(n-1)/2次比較,而此排序只要3輪,共比較(n-1)+(n-2)+(n-3)次,第一輪1將上移一位,第二輪1將 移到首位,第三輪將發現無數據交換,序列有序而結束。但它同樣是一個對數據有序性非常敏感的排序算法,只適合于數據基本有序的排序。
?
快速排序:它同樣是冒泡排序的改進,它通過一次交換能消除多個逆序,這樣可以減少逆序時所消耗的掃描和數據交換次數。在最優情況下,它的排序時間復雜度為O(nlog2n)。 即每次劃分序列時,能均勻分成兩個子串。但最差情況下它的時間復雜度將是O(n^2)。即每次劃分子串時,一串為空,另一串為m-1(程序中的100K正 序和逆序就正是這樣,如果程序中采用每次取序列中部數據作為劃分點,那將在正序和逆時達到最優)。從100K中正序的結果上看“快速排序”會比“冒泡排 序”更慢,這主要是“冒泡排序”中采用了提前結束排序的方法。有的書上這解釋“快速排序”,在理論上講,如果每次能均勻劃分序列,它將是最快的排序算法, 因此稱它作快速排序。雖然很難均勻劃分序列,但就平均性能而言,它仍是基于關鍵字比較的內部排序算法中速度最快者。
?
直接選擇排序:簡單的選擇排序,它的比較次數一定:n(n- 1)/2。也因此無論在序列何種情況下,它都不會有優秀的表現(從上100K的正序和反序數據可以發現它耗時相差不多,相差的只是數據移動時間),可見對 數據的有序性不敏感。它雖然比較次數多,但它的數據交換量卻很少。所以我們將發現它在一般情況下將快于冒泡排序。
?
堆排序:由于它在直接選擇排序的基礎上利用了比較結果形成。效率提高很大。它完成排序的總比較次數為O(nlog2n)。它是對數據的有序性不敏感的一種算法。但堆排序將需要做兩個步驟:-是建堆,二是排序(調整堆)。所以一般在小規模的序列中不合適,但對于較大的序列,將表現出優越的性能。
?
直接插入排序:簡 單的插入排序,每次比較后最多移掉一個逆序,因此與冒泡排序的效率相同。但它在速度上還是要高點,這是因為在冒泡排序下是進行值交換,而在插入排序下是值 移動,所以直接插入排序將要優于冒泡排序。直接插入法也是一種對數據的有序性非常敏感的一種算法。在有序情況下只需要經過n-1次比較,在最壞情況下,將需要n(n-1)/2次比較。
?
希爾排序:增量的選擇將影響希爾排序的效率。但是無論怎樣選擇增量,最后一定要使增量為1,進行一次直接插入排序。但它相對于直接插入排序,由于在子表中每進行一次比較,就可能移去整個經性表中的多個逆序,從而改善了整個排序性能。希爾排序算是一種基于插入排序的算法,所以對數據有序敏感。
?
歸并排序:歸并排序是一種非就地排序,將需要與待排序序列一樣多的輔助空間。在使用它對兩個己有序的序列歸并,將有無比的優勢。其時間復雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n)。對數據的有序性不敏感。若數據節點數據量大,那將不適合。但可改造成索引操作,效果將非常出色。
??????基數排序:在程序中采用的是以數值的十進制位分解,然后對空間采用一次性分配,因此它需要較多的輔助空間(10*n+10), (但我們可以進行其它分解,如以一個字節分解,空間采用鏈表將只需輔助空間n+256)。基數排序的時間是線性的(即O(n))。由此可見,基數排序非常吸引人,但它也不是就地排序,若節點數據量大時宜改為索引排序。但基數排序有個前提,要關鍵字能象整型、字符串這樣能分解,若是浮點型那就不行了。
總結 各種排序方法比較
??? ?簡單排序中直接插入最好,快速排序最快,當文件為正序時,直接插入和冒泡均最佳。
3. 按平均時間將排序分為四類
(1)平方階(O(n2))排序
??? 一般稱為簡單排序,例如直接插入、直接選擇和冒泡排序;
(2)線性對數階(O(nlgn))排序
??? 如快速、堆和歸并排序;
(3)O(n1+£)階排序
??? £是介于0和1之間的常數,即0<£<1,如希爾排序;
(4)線性階(O(n))排序
??? 如桶、箱和基數排序。
?
4. 影響排序效果的因素
??? 因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法應綜合考慮下列因素:
①待排序的記錄數目n;
②記錄的大小(規模);
③關鍵字的結構及其初始狀態;
④對穩定性的要求;
⑤語言工具的條件;
⑥存儲結構;
⑦時間和輔助空間復雜度等。
5 .不同條件下,排序方法的選擇
(1)若n較小(如n≤50),可采用直接插入或直接選擇排序。
??? 當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少于直接插人,應選直接選擇排序為宜。
(2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;
(3)若n較大,則應采用時間復雜度為O(nlgn)的排序方法:快速排序、堆排序或歸并排序。
??? 快速排序是目前基于比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
??? 堆排序所需的輔助空間少于快速排序,并且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。
??? 若要求排序穩定,則可選用歸并排序。但本章介紹的從單個記錄起進行兩兩歸并的? 排序算法并不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子文件,然后再兩兩歸并之。因為直接插入排序是穩定 的,所以改進后的歸并排序仍是穩定的。
6.排序算法的穩定性
?1) 穩定的:如果存在多個具有相同排序碼的記錄,經過排序后,這些記錄的相對次序仍然保持不變,則這種排序算法稱為穩定的。
??? 插入排序、冒泡排序、歸并排序、分配排序(桶式、基數)都是穩定的排序算法。
??? 2)不穩定的:否則稱為不穩定的。
??? 直接選擇排序、堆排序、shell排序、快速排序都是不穩定的排序算法
總結
以上是生活随笔為你收集整理的排序集锦(各种排序算法的特点及性能分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信金卡通过初审是什么意思
- 下一篇: 内存参数 计算_Spark统一内存管理的