快速选择算法本质上就是将快速排序算法进行优化,快速排序算法会递归左右区间来进行排序。而快速选择算法对左区间和右区间的数据个数与需要寻找的第K大的数字进行比较,然后选择了答案所存在的区间,舍弃了另一个不需要的区间,使算法复杂度降低到 O(n+ n/2 + n/4 +...+)也就是 O(n);
例题:
#include<iostream> using namespace std; const int N = 1e6+10; int a[N]; int quick_choose(int a[],int L,int R,int k){ if(L==R){return a[L];} int i = L-1; int j = R+1; int x = a[L]; while(i < j){ while( a[ ++ i] < x ); while( a[ -- j] > x ); if(i<j)swap(a[i],a[j]); } if(j-L+1 >= k){ return quick_choose(a,L,j,k); }else{ return quick_choose(a,j+1,R,k-j+L-1); } } int main(){ ios::sync_with_stdio(false); int n,k; cin>>n>>k; for(int i=0;i<n;i++){ cin>>a[i]; } cout<<quick_choose(a,0,n-1,k)<<endl; return 0; }