第K(大)小数

测试:  acdreamoj   瑶瑶的第K大

分治策略, 不断的把序列【L, R】分为【】 <= mid  , 【】>=mid    , O(n) 。

int   x[5000008] ;

void  kthmin(int L , int R , int k){
      int i = L , j = R , mid = x[(L+R)>>1] ;
      do{
           while(x[i] < mid) i++ ;
           while(x[j] > mid) j-- ;
           if(i <= j){
                 swap(x[i] , x[j]) ;
                 i++ , j-- ;
           }
      }while(i <= j) ;
      if(L <= j && k <= j-L+1)  kthmin(L , j , k) ;
      if(i <= R && k >= i-L+1)  kthmin(i , R , k-(i-L)) ;
}

int  getint(){
     int t = 0 ;
     char c = getchar() ;
     while(c < '0' || c > '9')  c = getchar() ;
     while('0' <= c && c <= '9'){
          t = t*10 + c - '0' ;
          c = getchar() ;
     }
     return t ;
}

int main(){
    int   n , k  ;
    while(scanf("%d%d" , &n , &k) != EOF){
         for(int i = 1 ; i <= n ; i++)  x[i] = getint() ;
         kthmin(1 , n , n-k+1) ;
         printf("%d\n" , x[n-k+1]) ;
    }
    return 0;
}

第k小  kthmin(1, n , k) ;

第k大 kthmin(1,n, n-k+1) 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值