题目:
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
这个的题目中提示采用快速排序的方法进行查找,在快排的时候,通过左右指针和a[end]的比较,以及right和left左右数的交换,最后能够得到第left小的数是a[end]。(这里要注意,由于是升序排序,所以得到的数是第k小,而不是第k大,当时这一块没想明白,调试了好久)。所以可以换个思路,按照降序排序的思路写快排,left找比a[end]小的数,right找比a[end]大的数,然后交换,这样通过降序排序的思路,就可以得到第left大的数是a[end],然后比较left+1和K的值,小于的话往右边找,大于的话往左边找,等于则直接返回当前值。
完整代码如下:
public int findKth(int[] a, int n, int K) {
// write code here
return find(0, n-1, a, K);
}
public int find(int begin,int end,int[] a,int n ) {
int p = partition(begin, end, a); //找到的第p大的数
if(p+1>n) {
return find(begin, p-1, a, n);
}else if(p+1<n){
return find(p+1, end, a, n);
}else {
return a[p];
}
}
public int partition(int begin,int end,int[] a) {
if(begin>end) {
return -1;
}
int i=begin,j=end;
int key = a[end];
while(i<j) {
while(i<j&&a[i]>=key) {
i++;
}
while(i<j&&a[j]<=key) {
j--;
}
swap(i,j,a);
}
swap(i, end, a);
return i;
}
public void swap(int i,int j ,int[]a) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}