資料結構與演算法系列 排序 1 概述

2022-05-02 07:36:11 字數 2128 閱讀 2240

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

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

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

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

穩定排序:假設在待排序的檔案中,存在兩個或兩個以上的記錄具有相同的關鍵字,在用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。其中冒泡,插入,基數,歸併屬於穩定排序,選擇,快速,希爾,歸屬於不穩定排序。(穩定:插冒歸基;  不穩定:快選堆希)

就地排序:若排序演算法所需的輔助空間並不依賴於問題的規模n,即輔助空間為o(1),則稱為就地排序。

精簡排序:對一對數字不進行兩次和兩次以上的比較。(精簡:直接插入,歸併排序)

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

將整個初始檔案分為多個初始歸併段;

將初始歸併段進行歸併,直至得到乙個有序的完整檔案;

2. 時間組成:

內部排序所需要的時間

外存資訊讀寫所需要的時間 (關鍵) 

m要小 —– 置換選擇排序

huffman(歸併的順序,對外存的i/o次數降到最低)

內部歸併所需要的時間    

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

在實現將初始檔案分為 m 個初始歸併段時,為了盡量減小 m 的值,採用置換-選擇排序演算法(內部使用敗者樹實現),可實現將整個初始檔案分為數量較少的長度不等的初始歸併段。

同時在將初始歸併段歸併為有序完整檔案的過程中,為了儘量減少讀寫外存的次數,採用構建最佳歸併樹的方式(哈夫曼樹實現),對初始歸併段進行歸併(敗者樹實現),而歸併的具體實現方法是採用敗者樹的方式。

4. 優化遞進順序:

二路歸併【因為硬碟的讀寫速度比記憶體要慢的多,按照以上這種方法,每個資料都從硬碟讀了三次,寫了三次,要花很多時間。考慮k路】

多路歸併【k不是越大越好,因為k越大,在內部排序需要的時間越長,效率低。考慮減少初始順串的數量m】

置換選擇演算法【可以用敗者樹和堆排序實現,得到多個長度不等的初始歸併段,如何設定它們的歸併順序,可以使得對外存的訪問次數降到最低? 考慮結合哈夫曼樹】

最佳歸併樹(置換選擇演算法+哈夫曼樹+多路歸併+敗者樹)

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

發展歷史

相同點

首先它們三個的相同點就是在於:空間和時間複雜度都是一樣的o(n*logn)。調整一次的時間複雜度都是o(logn)的。 

所以這道題用堆來做,跟用敗者樹來做並沒有本質上的演算法複雜度量級上的差別。

不同點

資料結構與演算法系列——排序(1)_概述

資料結構與演算法系列——排序(2)_直接插入排序

資料結構與演算法系列——排序(3)_折半插入排序

資料結構與演算法系列——排序(4)_shell希爾排序

資料結構與演算法系列——排序(5)_簡單選擇排序

資料結構與演算法系列——排序(6)_樹形選擇排序

資料結構與演算法系列——排序(7)_堆排序

資料結構與演算法系列——排序(8.1)_氣泡排序

資料結構與演算法系列——排序(8.2)_雞尾酒排序

資料結構與演算法系列——排序(9)_快速排序

資料結構與演算法系列——排序(10)_歸併排序

資料結構與演算法系列——排序(11)_基數排列

資料結構與演算法系列——排序(12)_計數排序

資料結構與演算法系列——排序(13)_鴿巢排序

資料結構與演算法系列——排序(14)_桶排序

資料結構與演算法系列——排序(15)_外部排序

各種排序演算法時間複雜度比較

資料結構 排序演算法系列總結

目錄 1 空間複雜度 2 穩定性 3 執行時間 4 目前預設的sort內建函式排序函式 5 六種常用排序方法 空間複雜度產生的原因有兩個 重新定義了一塊空間用於儲存資料 遞迴產生了棧空間 氣泡排序 選擇排序 堆排序和插入排序屬於原地實現排序,因此空間複雜度為常數級別 快速排序,在演算法中雖然沒有使用...

資料結構與演算法系列 排序 8 1 氣泡排序

核心思想 氣泡排序是一種典型的 交換排序 通過比較相鄰元素大小來決定是否交換位置 氣泡排序的思想 不停地比較相鄰的兩個記錄,如果相鄰的兩個記錄的次序是反序則交換,直到所有的記錄都已經排好序了 使關鍵字最小或最大的記錄如氣泡一般逐漸往上 漂浮 直至 水面 所以叫氣泡排序 比較相鄰的元素。如果第乙個比第...

資料結構與演算法系列 基數排序

基數排序與其他的排序方法 都不同,它不需要比較關鍵字的大小。演算法的時間複雜度是o n 相比於快速排序的o nlgn 從表面上看具有不小的優勢.但事實上可能有些出入,因為基數排序的n可能具有比較大的係數k.因此在具體的應用中,應首先對這個排序函式的效率進行評估.它是根據關鍵字中各位的值,通過對排序的...