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

时间:2014-09-27 21:54:16

标签: 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);
        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;

    }

}

如果有人能解释我的错误,我真的很感激。

1 个答案:

答案 0 :(得分:0)

问题出在findpivot(CamelCase中应为findPivot):

while(left <= right)

应该是

while(left < right)

另外,您可以以更好的方式编写quick_select方法:

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);
}