Java 如何对大型整数数组进行排序?

Java 如何对大型整数数组进行排序?,java,arrays,Java,Arrays,在工作面试中,我被问到以下问题: 我们有一个客户端应用程序,它可以发送请求并接收INT数据流(可能很大,但小于INT_MAX)。我们需要这样做: Int Data ----> Our ----> Sorted Int Data Stream App Data Stream 因此,我将编写如下方法: public int[] sort(int[] array){ Arrays.sort(array); return array; }

在工作面试中,我被问到以下问题:

我们有一个客户端应用程序,它可以发送请求并接收INT数据流(可能很大,但小于INT_MAX)。我们需要这样做:

Int Data  ----> Our  ----> Sorted Int Data
Stream          App        Data Stream
因此,我将编写如下方法:

public int[] sort(int[] array){
   Arrays.sort(array);
   return array;
}

问题是,大的
数组
无法放入堆栈,将被放入,这会降低性能。如何以性能良好的方式重构它?

独立于编程语言,对大量数据进行排序的常用方法如下:

  • 只对数据块进行排序
  • 使用合并排序合并所有已排序的块
一些优化的实现甚至对大致适合CPU缓存的数据集执行插入排序或类似操作(例如timsort)


然而,由于数据确实适合RAM,Java的本机实现应该已经非常快了。如果它超过了RAM,或者您想限制RAM的使用,那么您必须使用。但这显然要慢一些,因为它会进入磁盘。如果他们问你如何对数据进行排序,但没有提供要排序的数据,那么Arrays.sort()应该可以正常工作。但是,排序的最佳方式取决于数据,快速排序和插入对于整数数组的排序最快,但是对于浮点数组,您需要一种专门的排序方法


^这是许多可接受的排序算法的完整列表,每种算法都有数学上的缺点。

如果数据不能放入堆栈中,我认为没有任何魔法可以让它成功fit@Felk是的,这就是为什么我问如何用另一种方式来处理它。除非你能把整套INT停在某个地方,我看不出有什么简单的方法可以把整个集合分类。即使是分块工作也会迫使你检查之前的所有分块。你的问题不清楚。是否要对数据流进行排序?流意味着数据的连续输入。在首次下载所有Int之前,无法对Int流进行排序。那么,您的问题仅仅是“什么是对整数数组进行排序的最快方法”?您看过了吗?我使用了外部排序技术来对60GB的数据进行排序。该文件为.csv格式,每行包含两个大的十进制数。实施起来并不难。我将这个文件划分为每个块64MB(临时文件)。然后我把每一块都分类了。Rest被合并排序到最终文件中。它确实起作用了,总共花了大约32分钟。调整块大小也会影响时间。