多路歸併排序

2021-10-19 06:10:56 字數 790 閱讀 8819

雪壓枝頭低,雖低不著泥

今天準備放假,無聊看到乙個場景題,問題如下:

有乙個檔案裡面儲存著很多很多很多的無序的數,然後要求進行乙個排序,記憶體限定,磁碟足夠

然後搗鼓了一下,學到了一種新技能 - 多路歸併排序

學習的過程是這樣的:

第一步 :  把儲存著很多很多很多數的檔案進行切割,切割成n個小檔案,每個小檔案都儲存一些無序的數,具體切割的每個檔案的大小不要超過機器的記憶體,如下圖:

第二步: 檔案切割後標記每個檔案唯一的標識,暫且標識為 檔案1、檔案2 .... 檔案n; 然後對每個檔案裡面的資料進行記憶體排序,並把檔案裡最小的數記錄到記憶體中,如下圖;

第三步:磁碟建立乙個新的檔案,對記憶體裡面的數字進行排序,將最小的數字追加到檔案中,並記錄最小的數字對應的檔案,如這一輪中最小的數字是7,將7追加新檔案,然後再從7對應的有序的檔案n中取下乙個數到記憶體結構的排序陣列中,然後又再將最小的數字追加到新檔案中.... 如此的反覆,這樣就可以保證記憶體只有乙個陣列在排序,相當於乙個中轉站,從磁碟取數排序,然後再將數追加到磁碟中

最後,附上乙個整體的資料流向圖

多路歸併排序

我們有如下乙個問題 對於若干個長度相同的序列,將其合併成乙個有序的序列。暴力的方法顯然是不可取的,這裡可以利用優先佇列來處理這個問題。首先從簡單的開始,對於2路歸併排序,設兩個序列為,將,排序,有 a1 a2 a3 an b1 b2 b3 bn 建立乙個優先佇列,佇列中首先存入元素 a1,0 b1,...

多路歸併排序

下面的問題描述及相關文字都參考於csdn中july的部落格,在此對july表示感謝。july的部落格位址如下 在對海量資料排序時,有時不能把資料全部匯入到記憶體中,這時需要用到多路歸併排序。比如輸入 乙個最多含有n個不重複的正整數 也就是說可能含有少於n個不重複正整數 的檔案,其中每個數都 小於等於...

多路歸併排序的實現

為了更好地測試程式,首先利用以下方法生成了1000000個整數,每個整數均不相同 生成隨機排列的1000000個數字,每個數字都不相同 const int size 1000000 int num size void produce srand unsigned time null 隨機交換隨機的兩...