算法学习——快速选择算法


快速选择算法本质上就是将快速排序算法进行优化,快速排序算法会递归左右区间来进行排序。而快速选择算法对左区间和右区间的数据个数与需要寻找的第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