按平均時間將排序分為四類:
(1)平方階(o(n2))排序
一般稱為簡單排序,例如直接插入、直接選擇和氣泡排序;
(2)線性對數階(o(nlgn))排序
如快速、堆和歸併排序;
(3)o(n1+£)階排序
£是介於0和1之間的常數,即0<£<1,如希爾排序;
(4)線性階(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
各種排序演算法複雜度比較
寫在前面 筆試題目當中會出現各種排序演算法的比較,分為最好,最壞,平均情況的複雜度比較,在這裡總結一下。主要內容 最好情況 一般會這麼問 在各自最優條件下以下演算法複雜度最低的是 看清題目的要求是問在最優的條件下,所以插入排序和氣泡排序是最優的為o n 的複雜度。氣泡排序這裡為啥最好情況時o n 氣...
各種排序演算法比較 時間複雜度,空間複雜度
n 2表示n的平方,選擇排序有時叫做直接選擇排序或簡單選擇排序 排序方法平均時間最好時間最壞時間 桶排序 不穩定 o n o n o n 基數排序 穩定 o n o n o n 歸併排序 穩定 o nlogn o nlogn o nlogn 快速排序 不穩定 o nlogn o nlogn o n ...
演算法複雜度和排序演算法比較
演算法複雜度 時間複雜度 常見的時間複雜度有 常數階o 1 對數階o log2 n 線性階o n 線性對數階o nlog2 n 平方階o n 2 立方階o n 3 k次方階o n k 指數階o 2 n 隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。空間複雜度 如當乙個演算法...