之前有寫過內部排序,這次看到嚴蔚敏老師的書上還介紹了外部排序,就一起記錄一下,以便以後可以看看:
外部排序是指資料量很大,一下子不能將所有的資料放入記憶體裡面進行排序,只能一部分一部分從硬碟中讀取資料,送入內部排序,將內部排序的結果取出,換下一批資料進行排序。
對於外部排序的提高的核心問題是:減少外部儲存讀寫的次數。在一般情況下,對m個初始歸併段進行k-路平衡歸併,歸併的趟數:s=以k為底,m的對數結果的向上取整值。
由於k的增加能夠減少m便能減少儲存讀寫的次數,但是k的增加,內部歸併時間也會增大,這樣不是我們所希望的。所以我們在內部排序的時候如果能選擇一種演算法將不隨k的選擇而增加內部排序的時間的話,那就是比較好的,這就是」敗者樹「,看一下敗者樹的定義:在對乙個序列進行初始堆的建立,然後每次讓子孩子的大的去上一次,這樣的過程就是構建乙個敗者樹。
敗者樹的核心**:
void adjust(int s)
t=t/2;
} losertree[0]=s;
}void createlosertree()
void k_merge()
adjust(p);
} cout《在整個排序的過程中,選擇最小的關鍵字和輸入、輸出交叉或平行進行。
過程:
假設初始待排序檔案為fi,初始歸併段檔案為輸出檔案fo,記憶體工作區為wa,fo與wa的初始狀態為空,並假設記憶體工作去wa的容量可容納w個記錄,則置換-選擇排序的操作的過程為:
(1)、從fi輸入w個記錄到工作區wa。
(2)、從wa中選出其中關鍵字最小的記錄,記為minimax記錄。
(3)、將minimax記錄輸出到fo中去。
(4)、若fi不為空,則從fi輸入下乙個記錄到wa中。
(5)、從wa中所有關鍵字比minimax記錄關鍵字大的記錄中選出最小關鍵字記錄,作為新的minimax記錄。
(6)、重複(3)~(5),直至wa中選不出新的minimax記錄為止,由此得到乙個初始歸併段,輸出乙個歸併段的結束標記到fo中去。
(7)、重複(2)~(6),直至wa為空。由此得到全部歸併段。
當然由於置換選擇排序出來的結果可能使得每個段不一樣,這樣用k路平衡歸併樹似乎不是很好,所以選擇可以選擇用哈夫曼樹,這樣構造的樹稱為最佳歸併樹。
資料結構 排序 外部排序總結
1.影響內部排序時間效率的是移動和比較的次數,影響外部排序時間效率的是i o次數。2.歸併的躺數越少,讀寫磁碟的次數就越少,歸併的躺數 第一 k為歸併路數,增大k,可以降低躺數,減少io次數 第二 r為初始歸併段的個數,減少r,可以降低躺數,減少io次數 可是歸併路數一旦增大,內部比較的壓力就會變大...
資料結構 排序
小小總結了下 希望別不記得 排序型別 排序方法 平均時間 最壞時間 最好時間 穩定空間 插入直接插入 o n2 o n2 o n 穩定o 1 希爾排序 o n3 2 增量序列最後為1,只有公因子1 不穩o 1 選擇簡單選擇 o n2 o n2 o n 穩定o 1 堆排序o n lb n o n lb...
資料結構 排序
郝斌版 資料結構 學習筆記 冒泡 公升序,12比,大放後面,再23比,直至最大的在最後面 插入 2,3,4,依次插入值,保證插入值後的序列為有序的 選擇 後面所有的最小值依次排到最前 快速排序 歸併排序 22排,44排,88排.排序演算法標準 時間,空間,穩定性 排序和查詢的關係 排序是查詢的前提,...