在Java中对包含数百万个数字的数组进行排序

时间:2011-07-18 05:18:31

标签: java arrays

这是一个面试问题&我正在寻找专家可以更好地回答的问题......

如何在Java中对包含数百万个数字的数组进行排序?

谢谢!

6 个答案:

答案 0 :(得分:4)

面试问题从来没有正确的答案。 面试官教会问开放式问题,看看你如何思考和推理问题。 反过来,您应该展示思维过程并证明您可以用“软件工程方式”思考。

类似的东西:

  1. 哦... 100万号......
  2. 我认为它们很简单,所以100万将占用大约4兆字节的内存
  3. (嗯......可能我在这里错了,长时间需要8个字节,因此它将是8兆字节......现在对于那个问题来说不是那么重要。)
  4. 我们可以将它加载到内存并使用现成的算法Arrays.sort(long [])
  5. (我知道我的工具和核心库)。
  6. 没有额外的内存和O(n * log(n))复杂度(6 000 000次操作顺便说一句)。
  7. 你能更快地完成吗?
  8. 哦......我记得我听说过Radix排序 - 该算法给出了o(k * n)复杂度,其中k是重要数据的数量(长整数,它将是整数的两倍(20亿= 9位数) )= 18位数)所以它将是18 * 1百万=哦...它将慢3倍,我不确定算法需要多少额外的内存。
  9. 如果我们有太多数据会溢出可用内存?
  10. 我们会将数据分成l个大小为m的块,这样每个块都可以装入内存
  11. 我们将分别对每个块进行排序并将结果存储到文件
  12. 合并已排序的文件将采用o(m)速度
  13. 我们需要执行l-1这样的合并

答案 1 :(得分:0)

使用JVM“专家”的方式:

Arrays.sort(numberArray);

答案 2 :(得分:0)

因为它是整数,并且有一百万个 - 基数排序,就地并且有可用CPU的线程数

答案 3 :(得分:0)

在数组中存储数百万个数据不是一个好主意。它可能会导致MemoryOutOfBounds异常。这会导致性能问题。 但是如果你想对数组进行排序

int[] intArray = new int[] {4, 1, 3, -23};
Arrays.sort(intArray);
// [-23, 1, 3, 4]

String[] strArray = new String[] {"z", "a", "C"};
Arrays.sort(strArray);
// [C, a, z]

// Case-insensitive sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
// [a, C, z]

// Reverse-order sort
Arrays.sort(strArray, Collections.reverseOrder());
// [z, a, C]

// Case-insensitive reverse-order sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(Arrays.asList(strArray));
// [z, C, a]

答案 4 :(得分:0)

如果数字在有限范围内,则使用100万的布尔数组。这将使内存圣人降至125 MB。使用index作为数字和值为true或false。 Nullify现有数组,并将其填充为通过布尔数组读取。

答案 5 :(得分:0)

我们可以将条目放在NavigableHashMap中,以便以排序的方式保存数据。因此,在放置密钥时检查是否已存在密钥,然后将值增加1.现在,同时提取数据打印密钥的倍数值。就在这种情况下,我们刚刚运行了一次O(N)。