內部排序方法

一、分類

按平均時間將排序分爲四類:算法

a、平方階(O(n2))排序

    通常稱爲簡單排序,例如直接插入、直接選擇和冒泡排序;工具

b、線性對數階(O(nlgn))排序

    如快速、堆和歸併排序;spa

c、O(n1+£)階排序

     £是介於0和1之間的常數,即0<£<1,如希爾排序;指針

d、線性階(O(n))排序

    如桶、箱和基數排序。排序

二、各類排序方法比較

    簡單排序中直接插入最好,快速排序最快,當文件爲正序時,直接插入和冒泡均最佳。
遞歸

三、影響排序效果的因素

    由於不一樣的排序方法適應不一樣的應用環境和要求,因此選擇合適的排序方法應綜合考慮下列因素:
索引

    ①  待排序的記錄數目n;字符串

    ②  記錄的大小(規模);二叉樹

    ③   關鍵字的結構及其初始狀態;方法

    ④  對穩定性的要求;

    ⑤  語言工具的條件;

    ⑥   存儲結構;

    ⑦    時間和輔助空間複雜度等。

四、排序方法的選擇

(1)、若n較小(如n≤50),可採用直接插入或直接選擇排序。

    當記錄規模較小時,直接插入排序較好;不然由於直接選擇移動的記錄數少於直接插人,應選直接選擇排序爲宜。

(2)、若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序爲宜。

(3)、若n較大,則應採用時間複雜度爲O(nlgn)的排序方法:快速排序、堆排序或歸併排序。

    快速排序是目前基於比較的內部排序中被認爲是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;

    堆排序所需的輔助空間少於快速排序,而且不會出現快速排序可能出現的最壞狀況。這兩種排序都是不穩定的。

    若要求排序穩定,則可選用歸併排序。但本章介紹的從單個記錄起進行兩兩歸併的  排序算法並不值得提倡,一般能夠將它和直接插入排序結合在一塊兒使用。先利用直接插入排序求得較長的有序子文件,而後再兩兩歸併之。由於直接插入排序是穩定的,因此改進後的歸併排序還是穩定的。

(4)、在基於比較的排序方法中,每次比較兩個關鍵字的大小以後,僅僅出現兩種可能的轉移,所以能夠用一棵二叉樹來描述比較斷定過程。

    當文件的n個關鍵字隨機分佈時,任何藉助於"比較"的排序算法,至少須要O(nlgn)的時間。

    箱排序和基數排序只需一步就會引發m種可能的轉移,即把一個記錄裝入m個箱子之一,所以在通常狀況下,箱排序和基數排序可能在O(n)時間內完成對n個記錄的排序。可是,箱排序和基數排序只適用於像字符串和整數這類有明顯結構特徵的關鍵字,而當關鍵字的取值範圍屬於某個無窮集合(例如實數型關鍵字)時,沒法使用箱排序和基數排序,這時只有藉助於"比較"的方法來排序。

    若n很大,記錄的關鍵字位數較少且能夠分解時,採用基數排序較好。雖然桶排序對關鍵字的結構無要求,但它也只有在關鍵字是隨機分佈時才能使平均時間達到線性階,不然爲平方階。同時要注意,箱、桶、基數這三種分配排序均假定了關鍵字若爲數字時,則其值均是非負的,不然將其映射到箱(桶)號時,又要增長相應的時間。

(5)、有的語言(如Fortran,Cobol或Basic等)沒有提供指針及遞歸,致使實現歸併、快速(它們用遞歸實現較簡單)和基數(使用了指針)等排序算法變得複雜。此時可考慮用其它排序。

(6)、本章給出的排序算法,輸人數據均是存儲在一個向量中。當記錄的規模較大時,爲避免耗費大量的時間去移動記錄,能夠用鏈表做爲存儲結構。譬如插入排序、歸併排序、基數排序都易於在鏈表上實現,使之減小記錄的移動次數。但有的排序方法,如快速排序和堆排序,在鏈表上卻難於實現,在這種狀況下,能夠提取關鍵字創建索引表,而後對索引表進行排序。然而更爲簡單的方法是:引人一個整型向量t做爲輔助表,排序前令t[i]=i(0≤i<n),若排序算法中要求交換R[i]和R[j],則只需交換t[i]和t[j]便可;排序結束後,向量t就指示了記錄之間的順序關係:

        R[t[0]].key≤R[t[1]].key≤…≤R[t[n-1]].key

    若要求最終結果是:

       R[0].key≤R[1].key≤…≤R[n-1].key

則能夠在排序結束後,再按輔助表所規定的次序重排各記錄,完成這種重排的時間是O(n)。

相關文章
相關標籤/搜索