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这是一个未排序的数组,问题是不需要对数组进行排序。如果其他人看到这个答案,二进制搜索只能对排序后的数组进行搜索。