寻找第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;
    }
全部评论

相关推荐

冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
牛客618272644号:佬携程工作怎么样,强度大吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务