Java 使用快速排序查找第k个最小数

Java 使用快速排序查找第k个最小数,java,recursion,Java,Recursion,我正在实现一个算法,使用快速选择查找未排序数组中的第k个最小元素。我不确定我在哪里犯了错误。我使用快速排序的版本来查找第k个最小元素。我不是通过两个分区递归,而是通过一个分区递归。有人能帮我吗 public class quickselect { public static void main(String[] args){ int[] a={1,5,3,4,8,11}; int ans=quick_select(a, 4, 0, a.length-1)

我正在实现一个算法,使用快速选择查找未排序数组中的第k个最小元素。我不确定我在哪里犯了错误。我使用快速排序的版本来查找第k个最小元素。我不是通过两个分区递归,而是通过一个分区递归。有人能帮我吗

public class quickselect {

    public static void main(String[] args){
        int[] a={1,5,3,4,8,11};
        int ans=quick_select(a, 4, 0, a.length-1);
        System.out.println(ans);
    }


    private static int quick_select(int[] a, int k, int left, int right) {

        int pivot=findpivot(a,left,right);
        if(pivot==k-1){
            return a[pivot];
        }
        if(k-1<pivot){
            return quick_select(a, k, left, pivot-1);
        }
        else {
            return quick_select(a, k, pivot+1, right);
        }

    }

    private static int findpivot(int[] a, int left, int right) {

        int pivot = a[(left+right)/2];
        while(left<=right){
            while(a[left]<pivot){
                left++;
            }
            while(a[right]>pivot){
                right--;
            }

            if(left<=right){
                swap(a,left,right);
                left++;
                right--;
            }

        }
        return left;
    }

    private static void swap(int[] a, int i, int j) {

        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;

    }

}
公共类quickselect{
公共静态void main(字符串[]args){
int[]a={1,5,3,4,8,11};
int ans=快速选择(a,4,0,a.length-1);
系统输出打印LN(ans);
}
私有静态int快速_选择(int[]a,int k,int left,int right){
int pivot=findpivot(a,左,右);
如果(枢轴==k-1){
返回一个[枢轴];
}

如果(k-1问题出现在
findpivot
(在这种情况下应该是
findpivot
):


我写了一篇名为“”的博客文章我认为这可能会有所帮助。特别是关于通过打印进行调试的部分。这是大多数标准算法所需的全部内容。简短版本是,请耐心等待,按照代码的流程进行操作。@Keyser我很久以来一直在调试它。找不到错误。我找到了错误。谢谢你的帮助。你的答案正确吗?你不需要更改值吗如果你的pivot比k小的话,是k吗?因为在剩下的元素集中,你现在不会寻找第k个最小的元素,而是要寻找
k-pivot
最小的元素?对不起,我在你发布它时看到了你的评论,但我正在工作,忘记了。只是看了看,没有运行它,看起来还可以对我来说,它不是你说的
k-pivot
,因为我们总是传递
a
,而不是它的子数组。因此,
pivot
总是在
[0,a.length-1]
,该算法保证在一次迭代中被选为轴心的元素在排序数组中处于正确的索引,并且不再移动。这有意义吗?刚刚开始对(;)使用基本的
low>=high
作为内部终止条件的循环,而不是递归方法,但这确实是有意义的,感谢您在这些天之后找到了时间,非常感谢您!不用担心!享受您的编程:p
while(left <= right)
while(left < right)
private static int quick_select(int[] a, int k, int left, int right) {
    int pivot = findpivot(a,left,right);
    return pivot == k - 1 ? a[pivot] : k - 1 < pivot ? 
            quick_select(a, k, left, pivot - 1) : 
            quick_select(a, k, pivot + 1, right);
}