您的位置:首页 > 其它

利用快速排序思想求数组第k大元素

2017-10-21 11:11 323 查看

思路

快速排序中每次排序最后基准点所在的位置j代表它是第j大的元素,只要把j跟k相比,若j小于k,则只要在右半部分查找,等于k直接返回arr[j],否则在左半部分查找。这样算法的时间复杂度为O(n).程序如下:

public  static int quicksort(int[] arr,int l,int r,int n){
int base = partition(arr,l,r);
if(base == n-1){ //找到第n大元素直接返回
return arr[n-1];
}else if(base<n-1){ //在右半部分查找
return quicksort(arr, base+1, r,n);
}else{ //在左半部分查找
return quicksort(arr, l, base-1,n);
}
}
//返回已经排好的arr[j]索引j
public static int partition(int[] arr,int l,int r){
int v = arr[l];
int i = l+1;
int j = r;
while(true){
while(i<=r && arr[i]<v) i++;
while(j>=l+1 && arr[j]>v) j--;
if(i>j) break;
swap(arr, i, j);
i++;
j--;
}
swap(arr, l, j);
return j;
}
public static int find(int[] arr,int k){
return quicksort(arr,0,arr.length-1,k)
}
public static void main(String[] args) {
int[] test = new int[]{9,2,3,5,1,4,7,6,8,10,2,3};
System.out.println(find(test,4));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: