快排求第k大

/*
设某次排序后,分界点x右边有p个元素,
(此时x左边元素皆小于等于x,右边元素皆大于等于x)
若p == k-1,则 x 为恰第 k 大;
若p < k-1,则在区间[left, i) 之间求第 k-p-1 大
若p > k-1,则在区间[i+1, right) 之间求第k大
*/
#include <cstdio>
int qsort(int* A, int left, int right, int k){//在左闭右开区间[left, right)求第k大
    int i = left, j = right - 1;
    int tmp = A[left];
    while(i < j){
        while(A[j] >= tmp && i < j) j--;//从右往左第一个比tmp小的数
        if(i < j) A[i++] = A[j];
        while(A[i] <= tmp && i < j) i++;//从左往右第一个比tmp大的数
        if(i < j) A[i] = A[j--];
    }
    A[i] = tmp;
    int p = right - i - 1;//A[i]右边有p个元素
    if(p == k-1) return tmp;
    if(p < k-1) return qsort(A, left, i - 1, k - p - 1);
    if(p > k-1) return qsort(A, i + 1, right, k);
}
int main(){
     int n, k;
     while(scanf("%d%d", &n, &k)==2){
        int* A = new int[n+1];
        for(int i = 0; i < n; i++)
            scanf("%d", &A[i]);
    //int A[10] = {13,16,2,1,-1,6,54,123,32,-90};
        int ans = qsort(A, 0, n, k);//求第k大
        printf("%d\n", ans);
     }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值