利用快速排序来寻找第K大的数

在这里插入图片描述
这里我们先介绍一下快速排序。快速排算法主要就是选取一个基数,使大于这个基数的放在基数右侧。小于这个基数的数放在基数左侧。然后循环递归下去。快速排序的算法代码如下:

void quicksort(vector<int> &tmp, int left, int right){
        if(left>=right) return;
        int i,j;
        i = left;
        j = right;
        int base = tmp[left];
        while(i<j){
            while(i<j && tmp[j]>=base) j--;
            while(i<j && tmp[i]<=base) i++;
            if(i<j) swap(tmp[i],tmp[j]);
        }
        tmp[left] = tmp[i];
        tmp[i] = base;
        quicksort(tmp, left, i-1);
        quicksort(tmp, i+1, right);
    }

我们要寻找第K大的数,我们每次进行一次快速排序后,就判断基数右侧大于基数的数字个数,与K比较,是否进行二次快速排序,如果当前基数刚好是第K大数,返回这个数即可;如果右侧大于基数的数字个数比K小,说明还有数在左边,对左边继续进行快速排序;如果K大于当前基数的右侧的数字的个数,说明第K大的数在基数的右边,对右边进行快速排序。代码如下:

class Finder {
public:
    int quicksort(vector<int> &tmp, int left, int right, int k){
        int i,j;
        i = left;
        j = right;
        int base = tmp[left];
        while(i<j){
            while(i<j && tmp[j]>=base) j--;
            while(i<j && tmp[i]<=base) i++;
            if(i<j) swap(tmp[i],tmp[j]);
        }
        tmp[left] = tmp[i];
        tmp[i] = base;
        int big_num = right-i;
        if(k-big_num-1==0) return tmp[i];
        else if(k-big_num-1>0) return quicksort(tmp, left, i-1, k-big_num-1);
        else return quicksort(tmp, i+1, right, k);
    }
    int findKth(vector<int> a, int n, int K) {
        // write code here
        return quicksort(a, 0, n-1, K);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值