Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 选择算法有时返回错误的结果_Java_Algorithm - Fatal编程技术网

Java 选择算法有时返回错误的结果

Java 选择算法有时返回错误的结果,java,algorithm,Java,Algorithm,对于一个家庭作业问题,我需要编写一个Java方法,使用快速排序式分区来查找数组中的第k个最小数。我得到了partition()方法,我应该编写这个方法来获得第k个最小数 该问题要求枢轴始终是数组范围中最右边的元素 我得到的答复如下: public int partition(int left, int right, long pivot) { int leftPtr = left - 1; int rightPtr = right + 1; while (true) {

对于一个家庭作业问题,我需要编写一个Java方法,使用快速排序式分区来查找数组中的第k个最小数。我得到了partition()方法,我应该编写这个方法来获得第k个最小数

该问题要求枢轴始终是数组范围中最右边的元素

我得到的答复如下:

public int partition(int left, int right, long pivot) {
    int leftPtr = left - 1;
    int rightPtr = right + 1;
    while (true) {
        while (leftPtr < right && array[++leftPtr] < pivot); 
        while (rightPtr > left && array[--rightPtr] > pivot);

        if (leftPtr >= rightPtr)
            break;
        else
            swap(leftPtr, rightPtr);
    }
    return leftPtr;
}

我做错了什么?

仔细查看您对kthSmallest的递归调用,并将其与维基百科伪代码进行比较。k索引参数相对于什么位置?

递归调用的参数列表顺序错误。您正在查看的子数组中的位置应该是第三个参数,而不是第一个参数。

这里有一个有效的解决方案(使用Java实现):

我们是否假设您不能使用快速排序,然后直接跳到索引?如果没有,请输出数组以确保其顺序正确。此处不欢迎仅链接的答案,因为链接已损坏,而且看起来像垃圾邮件。你能在这里引用相关的部分吗?
public int kthSmallest(int left, int right, int k){
    if(left >= right){
        return array[left];
    }

    int pivotNewIndex = partition(left, right, array[right]);

    int pivotDist = pivotNewIndex - left - 1;

    if(pivotDist == k){
        return array[pivotNewIndex];
    } else if(k < pivotNewIndex){
        return kthSmallest(k, left, pivotNewIndex - 1);
    } else{
        return kthSmallest(k - pivotDist, pivotNewIndex + 1, right);
    }
}
array: [45, 60, 24, 82, 87, 79, 16, 32, 59, 83, 20, 2, 1, 
         50, 11, 79, 72, 32, 0, 48, 69, 74, 22, 6, 96]
expected result when k=4: 11
actual result when k=4: 87