有時,待排序的文件很大,計算機內存不能容納整個文件,這時候對文件就不能使用內部排序了(這裏作一下說明,其實全部的排序都是在內存中作的,這裏說的內部排序是指待排序的內容在內存中就能夠完成,而外部排序是指待排序的內容不能在內存中一會兒完成,它須要作內外存的內容交換),外部排序常採用的排序方法也是歸併排序,這種歸併方法由兩個不一樣的階段組成:算法
一、採用適當的內部排序方法對輸入文件的每一個片斷進行排序,將排好序的片斷(成爲歸併段)寫到外部存儲器中(一般由一個可用的磁盤做爲臨時緩衝區),這樣臨時緩衝區中的每一個歸併段的內容是有序的。spa
二、利用歸併算法,歸併第一階段生成的歸併段,直到只剩下一個歸併段爲止。blog
例如要對外存中4500個記錄進行歸併,而內存大小隻能容納750個記錄,在第一階段,咱們能夠每次讀取750個記錄進行排序,這樣能夠分六次讀取,進行排序,能夠獲得六個有序的歸併段,以下圖:排序
每一個歸併段的大小是750個記錄,記住,這些歸併段已經所有寫到臨時緩衝區(由一個可用的磁盤充當)內了,這是第一步的排序結果。內存
完成第二步該怎麼作呢?這時候歸併算法就有用處了,算法描述以下:同步
一、將內存空間劃分爲三份,每份大小250個記錄,其中兩個用做輸入緩衝區,另一個用做輸出緩衝區。首先對Segment_1和Segment_2進行歸併,先從每一個歸併段中讀取250個記錄到輸入緩衝區,對其歸併,歸併結果放到輸出緩衝區,當輸出緩衝區滿後,將其寫道臨時緩衝區內,若是某個輸入緩衝區空了,則從相應的歸併段中再讀取250個記錄進行繼續歸併,反覆以上步驟,直至Segment_1和Segment_2全都排好序,造成一個大小爲1500的記錄,而後對Segment_3和Segment_四、Segment_5和Segment_6進行一樣的操做。程序
二、對歸併好的大小爲1500的記錄進行如同步驟1同樣的操做,進行繼續排序,直至最後造成大小爲4500的歸併段,至此,排序結束。方法
能夠用一個圖示表示上述算法的歸併效果:im
以上對外部排序如何使用歸併算法進行排序進行了簡要總結,提升外部排序須要考慮如下問題:d3
一、如何減小排序所需的歸併趟數。
二、若是高效利用程序緩衝區,使得輸入、輸出和CPU運行儘量地重疊。
三、如何生成初始歸併段(Segment)和如何對歸併段進行歸併。