寻找第K大

快速排序:每次移动,可以找到一个标杆元素,然后将大于它的移到左边,小于它的移到右边。然后分别对左边和右边进行排序,不断划分左右子段,直到整个数组有序。放到这道题中,如果标杆元素左边刚好有K-1个比它大的,那么该元素就是第K大,如果它左边的元素比K - 1多,说明第K大在其左边,直接二分,不用管标杆元素右边,同理如果它左边的元素比K-1少,那第K大在其右边,左边不用管。

step 1:进行一次快排,大元素在左,小元素在右,得到的中轴p点。 step 2:如果 p - low + 1 = k ,那么p点就是第K大。 step 3:如果 p - low + 1 > k,则第k大的元素在左半段,更新high = p - 1,执行step 1。 step 4:如果 p - low + 1 < k,则第k大的元素在右半段,更新low = p + 1, 且 k = k - (p - low + 1),排除掉前面部分更大的元素,再执行step 1.

 public int findKth(int[] a, int n, int K) {
        // write code here
        return quicksort(a,0,n-1,K);

    }

    public int quicksort(int[] a,int l,int r,int k){
        int p=partion(a,l,r);

        if(p==a.length-k){
            return a[p];
        }else if (p>a.length-k){
            return quicksort(a,l,p-1,k);
        }else {
            return quicksort(a,p+1,r,k);
        }

    }

    public int partion(int[] a,int l,int r){
        int temp=a[l];
        while (l<r){
            while (l<r&&a[r]>=temp) r--;
            a[l]=a[r];
            while (l<r&&a[l]<=temp) l++;
            a[r]=a[l];
        }
        a[l]=temp;
        return l;
    }
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9068次浏览 83人参与
# 你的实习产出是真实的还是包装的? #
1662次浏览 40人参与
# MiniMax求职进展汇总 #
23731次浏览 306人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7382次浏览 40人参与
# 重来一次,我还会选择这个专业吗 #
433301次浏览 3926人参与
# 简历第一个项目做什么 #
31500次浏览 327人参与
# 米连集团26产品管培生项目 #
5607次浏览 214人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186885次浏览 1118人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152269次浏览 887人参与
# 研究所笔面经互助 #
118851次浏览 577人参与
# 简历中的项目经历要怎么写? #
309944次浏览 4189人参与
# 面试紧张时你会有什么表现? #
30473次浏览 188人参与
# 你今年的平均薪资是多少? #
212980次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63310次浏览 798人参与
# 我的求职精神状态 #
447961次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76415次浏览 374人参与
# 高学历就一定能找到好工作吗? #
64294次浏览 620人参与
# 牛客AI文生图 #
21399次浏览 238人参与
# 你怎么看待AI面试 #
179799次浏览 1229人参与
# 正在春招的你,也参与了去年秋招吗? #
363190次浏览 2636人参与
# 腾讯音乐求职进展汇总 #
160562次浏览 1109人参与
# 职能管理面试记录 #
10795次浏览 59人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务