有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
示例1:
输入
[1,3,5,2,2],5,3
返回值
2
示例2:
输入[72,6,57,88,60,42,83,73,48,85],10,10
返回值
6
看起来简单的快速排序变种,一不留神就容易翻车
这个代码细节很多,最主要的三个细节
- getIndex函数里面,初始化时
int i=l,j=r;
- 先从右到左找到第一个小于等于povit的,再从左到右找到第一个大于povit的,【 - -注意 - - 】写成 小于和大于等于,最终结果是错的
- 在交换的时候,要满足
i<j
的条件才交换
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
return quickSort(a,0,n-1,K-1);
}
public int quickSort(int[] a,int l,int r,int k){
int i=getIndex(a,l,r);
if(i==k){
return a[i];
}
else if(i>k){
//继续搜索前半段
return quickSort(a,l,i-1,k);
}
else{
//搜索后半段
return quickSort(a,i+1,r,k);
}
}
public int getIndex(int[] a,int l,int r){
int povit=a[l];
int i=l,j=r;
while(i<j){
//从右到左找到第一个小于等于povit的
while(i<j && a[j]<povit) j--;
//从左到右找到第一个大于povit的
while(i<j && a[i]>=povit) i++;
//swap
if(i<j){
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
a[l]=a[i];
a[i]=povit;
return i;
}
}