2015-10-08 49 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?谢谢。 –