有一个整数数组,请你根据快速排序的思路,找出数组中第 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); }