题目:给定一组数,求该组数中第k大的数
思路:可以借鉴快速排序算法,选取基准值后在一遍扫描后会把基准值放在其最终所在的位置。在此时判断基准值的位置在k的左边还是右边,从而选择不同方向的递归求解第k大。
inline void sort(int *s,int begin,int end,int k){
if(flag) return;
if(end<=begin) return;
int temp=s[begin];
int i=begin,j=end;
while(i<j){
while(s[j]>=temp&&i<j) j--;
while(s[i]<=temp&&i<j) i++;
swap(s[i],s[j]);
}
s[begin]=s[i];
s[i]=temp;
if(i==k) {flag=true;return;}
else if(i<k) {sort(s,i+1,end);}
else {sort(s,begin,i-1);}
if(flag) return;
}
在递归结束之后,第k大的数就是s[k]。
时间复杂度:平均时间复杂度为 O ( N ) O(N) O(N),最差时间复杂度为 O ( N 2 ) O(N^2) O(N2)。