Java 给定一个大小为n的整数数组,在不排序整个数组的情况下查找第k个最大元素
我有一些排序问题 声明: 编写一个方法Java 给定一个大小为n的整数数组,在不排序整个数组的情况下查找第k个最大元素,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,我有一些排序问题 声明: 编写一个方法KthLargest(),给定包含任意顺序整数和整数k的数组,该方法返回数组中第k个最大元素。假设k是一个较小的数字,n是一个非常大的数字,那么在最坏情况下的比较数方面,您的算法应该尽可能快,因此不要对大小为n的整个数组进行排序,以找出第k个最大的元素。您可以使用Java库中提供的Arrays.sort()方法 我对如何解决这个问题有明确的想法。。。如果我能先对整个数组排序的话 public static int KthLargest(int[] input
KthLargest()
,给定包含任意顺序整数和整数k的数组,该方法返回数组中第k个最大元素。假设k是一个较小的数字,n是一个非常大的数字,那么在最坏情况下的比较数方面,您的算法应该尽可能快,因此不要对大小为n的整个数组进行排序,以找出第k个最大的元素。您可以使用Java库中提供的Arrays.sort()方法
我对如何解决这个问题有明确的想法。。。如果我能先对整个数组排序的话
public static int KthLargest(int[] inputArray, int k)
{
Arrays.sort(inputArray);
return inputArray[k];
}
但是,问题声明明确指出,我不能对整个数组进行排序 使用k大小的最小堆查找第k个最大/最小元素。您无需对元素进行排序即可完成此操作。我可以写得更远,但这似乎是一个家庭作业问题 堆是最大/最小元素位于顶部的DS。若最大的元素作为top,那个么它就是max heap,否则它就是min heap。它们也称为优先级队列。
PS:我的意思是一个k大小的最小堆你可以使用二进制搜索算法。这是非常好的快速排序吨的东西。 基本上,它检查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
二进制搜索(算法)
I=1
做
M=(I+J)/2
如果K>数组[M],则I=M+1//上半部分
否则J=M-1//下半部分
WHILE(表[M]!=K或I
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;
}
静态无效搜索(int[]输入阵列,int k){
int-Found=-1;
int comp=0;
int-Mid=0;
int f=inputArray.length;
int d=输入阵列。长度%2;
而(发现==-1 | | d0){
d=中间+1;
}否则{
f=中-1;
}
}
发现退货;
}
您必须遍历所有数组,并保留k个最大数的记录。您可以更深入地了解k大小的最小堆是什么吗?这似乎是您正在谈论的一个算法,我以前从未学习过。一旦您理解了堆算法,您也可以理解@blorgbeard为分区中第k个最大元素提供的链接。我使用快速选择算法实现了这一点:user3610012这是一个未排序的数组,问题是不需要对数组进行排序。如果其他人看到这个答案,二进制搜索只能对排序后的数组进行搜索。