排序學習總結(待續)

    首先來說說排序的分類。

    1. 插入排序---直接插入排序、折半插入排序、希爾排序;

    2. 交換排序---冒泡排序、快速排序;

    3. 選擇排序---直接選擇排序、堆排序;

    3. 歸併排序;

    4. 分配排序---桶排序、基數排序;

    5. 外部排序。

 

    內部排序和外部排序的概念:在排序過程中,若整個文件都是放在內存中處理,排序時不涉及數據的內、外存交換,則稱之爲內部排序;反之,若排序過程中要進行數據的內、外存交換,則稱之爲外部排序。

    需要注意的是:

    1)內排序適用於記錄個數不很多的小文件;
   
2)外排序則適用於記錄個數太多,不能一次將其全部記錄放入內存的大文件。

 

直接插入排序

     有一個比喻非常恰當:插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。爲了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

 

  

    時間複雜度O(n2)空間複雜度O(1),穩定性:插入排序是穩定的,因爲具有同一值的元素必然插在具有同一值的前一個元素的後面,即相對次序不變。

    插入排序是一種簡單的排序方法,他不僅適用於順序存儲結構(數組),而且適用於鏈接存儲結構,不過在鏈接存儲結構上進行直接插入排序時,不用移動元素的位置,而是修改相應的指針。

 

 

希爾(shell)排序

    希爾排序(Shell Sort)又稱爲縮小增量排序。是1959年由D.L.Shell提出來的。該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個增量的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因爲直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

 

  

    時間複雜度O(n2)空間複雜度O(1),穩定性:希爾排序是不穩定的,大家可以寫個例子,數組當中兩個數相等,無法保證幾輪排序之後兩個數的相對位置不變,因此也無法保證穩定性。

    希爾排序在時間性能上優於直接插入排序。原因如下:

    (1) 當文件初態基本有序時直接插入排序所需的比較和移動次數均較少。
  (2) n值較小時,nn2的差別也較小,即直接插入排序的最好時間複雜度O(n)和最壞時間複雜度0(n2)差別不大。
  (3) 在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作爲距離排過序,使文件較接近於有序狀態,所以新的一趟排序過程也較快。
   
因此,希爾排序在效率上較直接插人排序有較大的改進。

快速排序

 

   快速排序是一種交換排序,採用分治算法,其基本思想是:將原問題分解爲若干個規模更小但結構與原問題相似的子問題。遞歸地解這些子問題,然後將這些子問題的解組合爲原問題的解。

   快速排序的基本思想如下:

設當前待排序的無序區爲R[low..high],利用分治法可將快速排序的基本思想描述爲:
①分解:

   
 在R[low..high]中任選一個記錄作爲基準(Pivot),以此基準將當前無序區劃分爲左、右兩個較小的子區間R[low..pivotpos-1)和R[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記爲pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。
  注意:
     劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示爲(注意pivot=R[pivotpos]):
     R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
                  其中low≤pivotpos≤high。
②求解:

    
通過遞歸調用快速排序對左、右子區間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
③組合:

   
 因爲當"求解"步驟中的兩個遞歸調用結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

 

    最壞時間複雜度O(n2),最好時間複雜度O(logn),快速排序屬於穩定排序。

選擇排序

    選擇排序(Selection Sort)的基本思想是:每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子文件的最後,直到全部記錄排序完畢。
    常用的選擇排序方法有直接選擇排序和堆排序。

直接選擇排序

    第i趟排序開始時,當前有序區和無序區分別爲R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[i]交換,使R[1..i]和R[i+1..n]分別變爲記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
    這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

直接選擇排序的平均時間複雜度爲O(n2),並且是不穩定的。

 

 

排序算法比較

(1)平方階(O(n2))排序
     一般稱爲簡單排序,例如直接插入、直接選擇和冒泡排序;

(2)線性對數階(O(nlgn))排序

     如快速、堆和歸併排序;

(3)O(n1+£)階排序

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

(4)線性階(O(n))排序

     如桶、箱和基數排序。

 

 

不同條件下,排序方法的選擇

(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。
     當記錄規模較小時,直接插入排序較好;否則因爲直接選擇移動的記錄數少於直接插入,應選直接選擇排序爲宜。
(2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序爲宜;
(3)若n較大,則應採用時間複雜度爲O(nlgn)的排序方法:快速排序、堆排序或歸併排序。
     快速排序是目前基於比較的內部排序中被認爲是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;
     堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。
     若要求排序穩定,則可選用歸併排序。


 

 

發佈了15 篇原創文章 · 獲贊 1 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章