排序之外部排序


有時,待排序的文件很大,計算機內存不能容納整個文件,這時候對文件就不能使用內部排序了(這里做一下說明,其實所有的排序都是在內存中做的,這里說的內部排序是指待排序的內容在內存中就可以完成,而外部排序是指待排序的內容不能在內存中一下子完成,它需要做內外存的內容交換),外部排序常采用的排序方法也是歸並排序,這種歸並方法由兩個不同的階段組成:

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)和如何對歸並段進行歸並。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM