算法學習——快速選擇算法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM