我正在实现一种算法,使用快速选择来查找未排序数组中的第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;
}
}
如果有人能解释我的错误,我真的很感激。
答案 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);
}