我在排序问题上遇到了一些问题。
声明:
编写一个方法KthLargest()
,给定一个包含任意顺序和整数k的整数的数组,返回数组中第k个最大的元素。假设k是一个小数且n是一个非常大的数,你的算法应该在最坏情况下的比较数量方面尽可能快,所以不要对整个n大小的数组进行排序以找出k-第一大元素。您可以使用Java库中提供的Arrays.sort()方法。
我对如何解决这个问题有明确的想法......那就是我可以先对整个数组进行排序。
public static int KthLargest(int[] inputArray, int k)
{
Arrays.sort(inputArray);
return inputArray[k];
}
然而,问题陈述明确指出我不能对整个数组进行排序。
答案 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;
}