给定大小为n的整数数组,找到第k个最大元素而不对整个数组进行排序

时间:2014-05-07 00:56:33

标签: java arrays algorithm sorting

我在排序问题上遇到了一些问题。

声明:

编写一个方法KthLargest(),给定一个包含任意顺序和整数k的整数的数组,返回数组中第k个最大的元素。假设k是一个小数且n是一个非常大的数,你的算法应该在最坏情况下的比较数量方面尽可能快,所以不要对整个n大小的数组进行排序以找出k-第一大元素。您可以使用Java库中提供的Arrays.sort()方法。

我对如何解决这个问题有明确的想法......那就是我可以先对整个数组进行排序。

public static int KthLargest(int[] inputArray, int k)
{
    Arrays.sort(inputArray);
    return inputArray[k];
}

然而,问题陈述明确指出我不能对整个数组进行排序。

2 个答案:

答案 0 :(得分:1)

使用k大小的最小堆来查找第k个最大/最小元素。您无需对元素进行排序即可执行此操作。我可以进一步写,但这似乎是一个功课问题。

堆是DS,其中最大/最小元素位于顶部。如果最大元素为top,则为max heap,否则为min heap。它们也称为优先级队列。 PS:我的意思是k大小的最小堆

答案 1 :(得分:1)

您可以使用二进制搜索算法。快速排序大量的东西是非常好的。 基本上,它检查k是大于还是小于中间值,然后将数组切成两半然后循环。 如果在使用二进制搜索之前没有排序,它将失败。

伪代码:

Binary search (algorithm)

I = 1

DO
 M = (I + J) / 2
 IF K > ARRAY[M] THEN I = M + 1 / / upper half
 ELSE J = M - 1 / / lower half
WHILE (TABLE[M] != K OR I < J)

IF TABLE[M] = K THEN RETURN M
ELSE RETURN -1 //-1 = not found

Java代码:

static void Search(int[] inputArray, int k) {  
    int Found = -1;
    int comp = 0;
    int Mid = 0;
    int f = inputArray.length;
    int d = inputArray.length%2;

    while (Found == -1 || d < f){
        Mid = (d + f)/2;

        NomComp = k.compareToIgnoreCase(inputArray[Mid]);

        if (NomComp == 0) {
            Found = k;
        } else if (NomComp > 0) {
            d = Mid + 1;  
        } else {
            f = Mid - 1;
        }
    }

    return Found;

}