题目:给定一组数,求该组数中第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)。