有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。
要求:时间复杂度
,空间复杂度
数据范围:
,
,数组中每个元素满足
有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
[1,3,5,2,2],5,3
2
[10,10,9,9,8,7,5,6,4,3,4,2],12,3
9
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
int privot(int a[], int low, int high);
void quicksort(int a[], int low, int high);
int findKth(int* a, int aLen, int n, int K ) {
// write code here
quicksort(a, 0, aLen-1); //从小到大排序
return a[aLen-K]; //返回第k大的
}
int privot(int a[], int low, int high){ //划分
int p = a[low];
while (low < high){
while(low < high && a[high] >= p) high--;
a[low] = a[high];
while(low < high && a[low] <= p) low++;
a[high] = a[low];
}
a[low] = p;
return low;
}
void quicksort(int a[], int low, int high){ //快排
if (low < high) {
int pri = privot(a, low, high);
quicksort(a, low, pri-1);
quicksort(a, pri+1, high);
}
} //快速排序
int Qsort(int *a,int low,int high){
int t=a[high];
while(low<high){
while(low<high&&a[low]>=t){
low++;
}
if(low<high){
a[high]=a[low];
}
while(low<high&&a[high]<=t)
high--;
if(low<high)
a[low]=a[high];
}
a[low]=t;
return low;
}
void Merge(int*a,int low,int high){
if(low<high){
int mid=Qsort(a,low,high);
Merge(a,low,mid-1);
Merge(a,mid+1,high);
}
}
int findKth(int* a, int aLen, int n, int K ) {
// write code here
Merge(a,0,n-1);
return a[K-1];
}
#define findKth(a, aLen, n, k) __findKth(a, n, n - k, 0, n - 1)
void swap(int* a, int* b) { if (*a ^ *b) *a ^= *b, *b ^= *a, *a ^= *b; }
/**
*
* @param a int整型一维数组
* @param aLen int a数组长度
* @param n int整型
* @param K int整型
* @return int整型
*/
int __findKth(int* a, int n, int k, int left, int right) {
// recursion exit condition
if (left == right) return *(a + left);
int i = left, j = right, x = *(a + left + ((right - left) >> 1));
do {
while (*(a + i) < x) ++i;
while (*(a + j) > x) --j;
if (i <= j) swap(a + i++, a + j--);
} while (i <= j);
if (k <= j) return __findKth(a, n, k, left, j);
else if (i <= k) return __findKth(a, n, k, i, right);
else return __findKth(a, n, k, j + 1, i - 1);
}