快速選擇算法本質上就是將快速排序算法進行優化,快速排序算法會遞歸左右區間來進行排序。而快速選擇算法對左區間和右區間的數據個數與需要尋找的第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; }