2015-10-08 74 views
1

需要排序大量的不能容納到內存中的整數。想知道合併排序是否正確?我的解決方案是這樣的,合併排序與大量的整數

  1. 使用基於內存的排序每個5%的整數,它可以保存到內存中,使用快速排序,在內存中執行有效;
  2. 在每20個塊被排序後,使用合併排序對20個列表進行排序,對於合併排序,我只需要將每個文件的一部分加載到內存中,並在同一列表的當前部分加載相同列表的下一部分完全分類爲最終結果。由於20個列表中的每一個都是排序的,我只需要從頭到尾順序加載部分塊,所以內存很實​​惠。

我不確定這是否是大量整數排序的正確方法?

+2

可能要看的東西是外部排序https://en.wikipedia.org/wiki/External_sorting –

+0

@Moogs,感謝您的信息,我認爲合併排序是外部排序? –

+1

是的,這是正確的方法。我用過很多次。除了我多次進行雙向合併,而不是20次合併。 –

回答

2

因爲,

他們是整數,其中大部分是1-100

所有你需要的是Counting Sort


它的實現非常簡單。

  1. 創建100個整數(或HashMap<int, int>)的陣列稱爲intCounts(利用64位整數,如果你認爲32位可以溢出)
  2. 逐個讀取,你必須排序
  3. 整數對於每一個inputInteger進行排序,只是做intCounts[inputInteger]++
  4. 您已經閱讀所有整數之後,intCounts[i]告訴你有多少次看到你的大整數集
  5. 的整數i只是遍歷您intCounts從最低指數指數最高
  6. 寫回iintCounts[i]
  7. 您現在已經寫回所有的輸入整數的排序列表。
+0

displayName,聰明而智能。 :) –

+1

@ LinMa:沒關係。我只知道。現在,你也是。 – displayName

+1

希望您隨時可以幫助通知我。喜歡向你學習。 :) –

1

GNU排序程序(就像它的Unix前身)使用內存排序,然後根據需要進行多次16路合併。見代碼在這裏閱讀更多:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/sort.c#n306

+0

感謝cliffordheath,對於16路合併,他們使用基於外部存儲的合併排序? –

+1

16路或任何k路排序通常是合併排序,在這種情況下是外部合併排序。 [wiki文章 - 外部排序](http://en.wikipedia.org/wiki/External_sorting)。 – rcgldr

+0

@rcgldr,如何決定爲k路優化k?謝謝。 –