题目:
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
输入
[1,3,5,2,2],5,3
返回值
2
首先快速排序要找到一个点,通过和这个点比较把小于这个点的数放到左边,反之 放到右边。最后返回left指针指向的索引。拿这个索引和K相比较,相等则返回该值,索引大于K,则在左边找,小于则在右边找。下面放代码。
public class Finder {
public int findKth(int[] a, int n, int K) {
// write code here
int m =quick(a,0,n-1,K); //快排加入K
return m;
}
public int quick(int[] arr,int left,int right,int k){
int poivt = partition(arr,left,right); // 快排中的基本方法
if(poivt - left == k-1){ // 相等 则返回
return arr[poivt];
}
if(poivt - left < k-1){ //小于则在右边找
return quick(arr,poivt+1,right,k-(poivt+1-left));
}
if(poivt - left > k-1){ //大于则在左边找
return quick(arr,left,poivt-1,k);
}
return -1;
}
public int partition(int[] arr,int left,int right){
int key = arr[left];
while(left < right){
while(left < right && arr[right] < key){ //右指针大于key的赋值到左指针
right--;
}
if(left < right){
arr[left] = arr[right];
left++; //赋值后左指针向后移动,开始左指针比较
}
while(left < right && arr[left] > key){ //左指针小于key的数放赋值到右指针
left++;
}
if(left < right){
arr[right] = arr[left];
right--; //赋值后右指针向前移动
}
}
arr[left] = key; //把比较的值放到left索引,返回left
return left;
}
}