具有大量元素的数组仅排序最大的n个元素

时间:2014-05-28 15:22:49

标签: java arrays algorithm sorting

我有一个包含大量元素的数组 - 超过2,000,000个。我需要获得最高(或最低)排名300元素。因此,每当我达到数组的第一个最高(或最低)300个元素时,返回它们。目前Arrays.sort用于整个数组,然后返回最高(或最低)的排名元素。

例如:{1,2,3,4,5,6,7,8,9}我想获得最高的3个元素;我需要:{9,8,7}

对此有任何建议吗?

修改

迄今为止发现的最佳资源,包含对不同解决方案的研究/比较:

http://www.michaelpollmeier.com/selecting-top-k-items-from-a-list-efficiently-in-java-groovy/

文章的源代码:

https://github.com/mpollmeier/Selection-Algorithms

3 个答案:

答案 0 :(得分:4)

您可以使用部分heapsort。构建具有minheap元素的1st 300

然后在进一步遍历数组时,检查当前元素是否大于堆的根元素。如果它更大,则删除根元素并添加这个新元素。

完成整个阵列后,minHeap将拥有最多的300个元素。

逐个提取根元素。元素将按升序弹出。

注意:无论N的值如何,堆都将始终包含k(300)个元素,因此在这种情况下堆操作应为O(logk)。

因此,此算法的复杂度顺序为O(Nlogk),其中N是数组的大小

空间复杂性 - O(k)

编辑: 如果你想要最低的300个元素,那么可以使用maxheap而不是minheap来跟踪类似的算法。

答案 1 :(得分:0)

这对你有用吗?此示例对数组中的前4个元素进行排序:

    double[] arr = new double[]{1.0,4.0,2.0,8.0,3.0,6.0,7.0,5.0};

    int nth = 4; //e.g. - sort the top 4 numbers
    Arrays.sort(arr,arr.length-nth-1,arr.length);
    System.out.println(Arrays.toString(arr));

输出:

[1.0, 4.0, 2.0, 3.0, 5.0, 6.0, 7.0, 8.0]

答案 2 :(得分:-1)

使用(T[], int, int, java.util.Comparator),这将对指定范围内的给定数组(T[])进行排序,仅对第一个int arg到第二个int arg的元素进行排序。比较器是可选的。