有時,待排序的檔案很大,計算機記憶體不能容納整個檔案,這時候對檔案就不能使用內部排序了(這裡做一下說明,其實所有的排序都是在記憶體中做的,這裡說的內部排序是指待排序的內容在記憶體中就可以完成,而外部排序是指待排序的內容不能在記憶體中一下子完成,它需要做內外存的內容交換),外部排序常採用的排序方法也是歸併排序,這種歸併方法由兩個不同的階段組成:
1、採用適當的內部排序方法對輸入檔案的每個片段進行排序,將排好序的片段(成為歸併段)寫到外部儲存器中(通常由乙個可用的磁碟作為臨時緩衝區),這樣臨時緩衝區中的每個歸併段的內容是有序的。
2、利用歸併演算法,歸併第一階段生成的歸併段,直到只剩下乙個歸併段為止。
例如要對外存中4500個記錄進行歸併,而記憶體大小只能容納750個記錄,在第一階段,我們可以每次讀取750個記錄進行排序,這樣可以分六次讀取,進行排序,可以得到六個有序的歸併段,如下圖:
每個歸併段的大小是750個記錄,記住,這些歸併段已經全部寫到臨時緩衝區(由乙個可用的磁碟充當)內了,這是第一步的排序結果。
完成第二步該怎麼做呢?這時候歸併演算法就有用處了,演算法描述如下:
1、將記憶體空間劃分為三份,每份大小250個記錄,其中兩個用作輸入緩衝區,另外乙個用作輸出緩衝區。首先對segment_1和segment_2進行歸併,先從每個歸併段中讀取250個記錄到輸入緩衝區,對其歸併,歸併結果放到輸出緩衝區,當輸出緩衝區滿後,將其寫道臨時緩衝區內,如果某個輸入緩衝區空了,則從相應的歸併段中再讀取250個記錄進行繼續歸併,反覆以上步驟,直至segment_1和segment_2全都排好序,形成乙個大小為1500的記錄,然後對segment_3和segment_4、segment_5和segment_6進行同樣的操作。
2、對歸併好的大小為1500的記錄進行如同步驟1一樣的操作,進行繼續排序,直至最後形成大小為4500的歸併段,至此,排序結束。
可以用乙個圖示表示上述演算法的歸併效果:
以上對外部排序如何使用歸併演算法進行排序進行了簡要總結,提高外部排序需要考慮以下問題:
1、如何減少排序所需的歸併趟數。
2、如果高效利用程式緩衝區,使得輸入、輸出和cpu執行盡可能地重疊。
3、如何生成初始歸併段(segment)和如何對歸併段進行歸併。
排序之外部排序
有時,待排序的檔案很大,計算機記憶體不能容納整個檔案,這時候對檔案就不能使用內部排序了 這裡做一下說明,其實所有的排序都是在記憶體中做的,這裡說的內部排序是指待排序的內容在記憶體中就可以完成,而外部排序是指待排序的內容不能在記憶體中一下子完成,它需要做內外存的內容交換 外部排序常採用的排序方法也是歸...
排序(二 外部排序
一 定義 外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。二 處理過程 1 按可用記憶體的大小,把外存上含有n個記錄的檔案分成若干個長度為l的子檔案,把這些子檔案依次讀入記憶體,並利用...
外部排序 歸併排序
歸併排序 歸併排序是採用分治的思想,將陣列劃分為兩個子陣列,然後遞迴的將每個子陣列再進行劃分,直到陣列中只剩一下乙個元素,然後開始排序合併,直到將所有的子陣列合併完成,整個資料就是有序的了。歸併排序乙個重要的操作函式就是合併函式 時間複雜度 將陣列分成的子陣列 用二叉樹表示,假設共有n層,第k層共有...