數據結構與算法系列——排序(1)_概述

1. 定義

  排序是將一組「無序」的記錄序列調整爲「有序」的記錄序列。份內部排序和外部排序。html

  內部排序:若整個排序過程不須要訪問外存便能完成,則稱此類排序問題爲內部排序。【衡量內排序的效率是數據的比較次數】算法

  外部排序:若參加排序的記錄數量很大,整個序列的排序過程不可能在內存中完成,則稱此類排序問題爲外部排序。【衡量外排序的效率是內存與外存的交換次數】 數據結構

  內部排序的過程是一個逐步擴大記錄的有序序列長度的過程。優化

2. 分類

   穩定排序:假設在待排序的文件中,存在兩個或兩個以上的記錄具備相同的關鍵字,在用某種排序法排序後,若這些 相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。其中冒泡,插入,基數,歸併屬於穩定排序,選擇,快速,希爾,歸屬於不穩定排序。(穩定:插冒歸基;  不穩定:快選堆希)
   就地排序:若排序算法所需的輔助空間並不依賴於問題的規模n,即 輔助空間爲O(1),則稱爲就地排序。
   精簡排序:對一對數字不進行兩次和兩次以上的比較。(精簡:直接插入,歸併排序)

3. 經常使用內部算法

4. 外部排序算法 

1. 實現外部排序的兩個過程:網站

  1. 將整個初始文件分爲多個初始歸併段;
  2. 將初始歸併段進行歸併,直至獲得一個有序的完整文件;

2. 時間組成:spa

  1. 內部排序所須要的時間
  2. 外存信息讀寫所須要的時間 (關鍵) 
    • 與歸併的趟數有關 
      • k要大 —– 傳統方法 會引發內部歸併時間增大 
        • 堆排序
        • 贏者樹
        • 敗者樹(目的:提升在k個歸併串中當前值中找到最小值的效率)
      • m要小 —– 置換選擇排序
    • Huffman(歸併的順序,對外存的I/O次數降到最低)
  3. 內部歸併所須要的時間    

3. 爲了提升整個外部排序的效率,分別從以上兩個方面對外部排序進行了優化:.net

  1. 在實現將初始文件分爲 m 個初始歸併段時,爲了儘可能減少 m 的值,採用置換-選擇排序算法(內部使用敗者樹實現),可實現將整個初始文件分爲數量較少的長度不等的初始歸併段。
  2. 同時在將初始歸併段歸併爲有序完整文件的過程當中,爲了儘可能減小讀寫外存的次數,採用構建最佳歸併樹的方式(哈夫曼樹實現),對初始歸併段進行歸併(敗者樹實現),而歸併的具體實現方法是採用敗者樹的方式。

4. 優化遞進順序:htm

  1. 二路歸併【由於硬盤的讀寫速度比內存要慢的多,按照以上這種方法,每一個數據都從硬盤讀了三次,寫了三次,要花不少時間。考慮K路】
  2. 多路歸併【K不是越大越好,由於K越大,在內部排序須要的時間越長,效率低。考慮減小初始順串的數量M】
  3. 置換選擇算法【能夠用敗者樹和堆排序實現,獲得多個長度不等的初始歸併段,如何設置它們的歸併順序,可使得對外存的訪問次數降到最低? 考慮結合哈夫曼樹】
  4. 最佳歸併樹(置換選擇算法+哈夫曼樹+多路歸併+敗者樹)

5 勝者樹 & 敗者樹 & 堆排序blog

發展歷史排序

    • :其實一開始就是隻有堆來完成多路歸併的,可是人們發現堆每次取出最小值以後,把最後一個數放到堆頂,調整堆的時候,每次都要選出父節點的兩個孩子節點的最小值,而後再用孩子節點的最小值和父節點進行比較,因此每調整一層須要比較兩次。 
    • 勝者樹:這時人們想可否簡化比較過程,這時就有了勝者樹,這樣每次比較只用跟本身的兄弟節點進行比較就好,因此用勝者樹能夠比堆少一半的比較次數。 而勝者樹在節點上升的時候首選須要得到父節點,而後再得到兄弟節點,而後再比較。
    • 敗者樹:這時人們又想可否再次減小比較次數,因而就有了敗者樹。在使用敗者樹的時候,每一個新元素上升時,只須要得到父節點並比較便可。 
    • 因此總的來講,減小了訪存的時間。 如今程序的主要瓶頸在於訪存了,計算倒幾乎能夠忽略不計了。

相同點

首先它們三個的相同點就是在於:空間和時間複雜度都是同樣的O(N*logN)。調整一次的時間複雜度都是O(logN)的。 
因此這道題用堆來作,跟用敗者樹來作並無本質上的算法複雜度量級上的差異。

不一樣點

  • :全部的節點都是關鍵字; 每次調整一層須要比較兩次(父親 左孩子|  父親 右孩子)。 
  • 勝者樹:葉子節點是關鍵字,非葉子節點保存勝者索引;每次調整一層須要比較1次(本身 兄弟),讀取兩次(父親| 兄弟)。
  • 敗者樹:葉子節點是關鍵字,非葉子節點保存敗者索引;每次調整一層須要比較1次(本身 父親),讀取一次(父親),只須要和路徑上的節點比較,不須要和兄弟節點比較,簡化了重構的過程。; 新增B[0]記錄比賽的勝者【在本例子中是ls[0]】

網站連接排序

  1. 數據結構與算法系列——排序(1)_概述
  2. 數據結構與算法系列——排序(2)_直接插入排序
  3. 數據結構與算法系列——排序(3)_折半插入排序
  4. 數據結構與算法系列——排序(4)_Shell希爾排序
  5. 數據結構與算法系列——排序(5)_簡單選擇排序
  6. 數據結構與算法系列——排序(6)_樹形選擇排序
  7. 數據結構與算法系列——排序(7)_堆排序
  8. 數據結構與算法系列——排序(8.1)_冒泡排序
  9. 數據結構與算法系列——排序(8.2)_雞尾酒排序
  10. 數據結構與算法系列——排序(9)_快速排序
  11. 數據結構與算法系列——排序(10)_歸併排序
  12. 數據結構與算法系列——排序(11)_基數排列
  13. 數據結構與算法系列——排序(12)_計數排序
  14. 數據結構與算法系列——排序(13)_鴿巢排序
  15. 數據結構與算法系列——排序(14)_桶排序
  16. 數據結構與算法系列——排序(15)_外部排序

參考網址

相關文章
相關標籤/搜索