找到数组中第n个最高数字的最有效方法?

时间:2014-02-02 21:45:20

标签: java arrays algorithm search mergesort

我想知道这是否是找到未排序数组中第n个最高数字的最有效方法。我做的是用mergeSort对它进行排序,然后找到第n个最高数字的索引。我认为这比大多数搜索更有效但我不太确定.....

import java.util.Arrays;
public class ThirdHighest {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int [] a = new int[]{3,5,6,7,8,2,1,10,9};
    System.out.print(Arrays.toString(a));
    mergeSort(a);
    System.out.print(Arrays.toString(a));
    System.out.print(nHighestValue(a, 3));

}
public static void mergeSort(int[] arr) {
    if(arr.length > 1) {
        int lengthLeft = arr.length / 2;

        int [] left = Arrays.copyOfRange(arr, 0, lengthLeft);
        int [] right = Arrays.copyOfRange(arr, lengthLeft, arr.length);
        mergeSort(left);
        mergeSort(right);
        merge(arr, left, right);
    }
}
public static void merge(int[] result, int[] left, int[] right){
    int l1 = 0;
    int r2 = 0;
    while(l1 < left.length || r2 < right.length) {
        if(l1 == left.length) {
            result[l1+r2] = right[r2];
            r2 += 1;
        } else if(r2 == right.length){
            result[l1+r2] = left[l1];
            l1 += 1;
        } else if(left[l1] < right[r2]) {
            result[l1 + r2] = left[l1];
            l1 += 1;
        } else {
            result[l1+r2] = right[r2];
            r2 += 1;
        }
    }
}
public static int nHighestValue(int[] a, int n) {
    int index = a.length - n;
    return a[index];

}

}

2 个答案:

答案 0 :(得分:1)

随机quickselect算法适用于平均情况复杂度O(n)。实际上,很少有O(n ^ 2)。它使用quicksort的分区功能

答案 1 :(得分:0)

从@alitereralmind演示,可以在O(n)中查找未校正数据中的最低最高

找到第N个最高(按要求)更复杂,因为您需要跟踪最佳候选人。这会将扫描转换为N深度插入排序,其值不在顶部N中。虽然这可能比完全排序更有效,但我不确定在正常大小的问题上进行额外的编码工作是否值得...尤其是如果可能再次发出类似的查询并且可以重用初始排序。