题目描述
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
思路:
- 在快速排序的基础上,判断当前把数组分为两半的“支点”的下标是不是K-1。
若是,直接返回。 - 若支点下标大于k-1,在支点左边用快排的方法看下层支点的下标是不是K-1。
- 若支点下标小于k-1,在支点右边用快排的方法看下层支点的下标是不是K-1。
import java.util.*;
public class Finder {
public int findKth(int[] a, int n, int K) {
return findk(a,0,n-1,K-1);
}
public int findk(int[]a, int low, int high, int k){
int left = low;
int right = high;
int tou = a[low];
while(low < high){
while(a[high] < tou){
high--;
}
while(low < high && a[low] > tou){
low++;
}
if(low < high){
int tmp = a[low];
a[low] = a[high];
a[high] = tmp;
}
}
if(low == k){
return a[low];
}
if(low < k){
return findk(a,low+1,right,k);
}
return findk(a,left,low-1,k);
}
}