无序数组中找到第 K 大的元素(快排改进版)

寻找第K大

http://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf

思路:我们利用快排分区的思想来解答这个问题,我们以数组最后一个元素记为 pivot, 将数组分为三个部分,a[0..q-1], a[q],a[q+1...r],然后我们比较 q+1 是否等于 k , 如果相等,我们返回 a[q],q+1 > k,我们在 a[0,q-1] 中递归寻找。
时间复杂度分析:第一次分区,我们查找了 n 个元素,第二次我们查找了 n/2 个元素,依次类推,最后区间缩小到 1,复杂度为 n+n/2 + n/4 + ....+1 为 O(2n-1) 即 O(n)。

import java.util.*;

public class Finder {
    public int findKth(int[] a, int n, int K) {
        // write code here
        return sortUseQuickSort_C(a,0,n-1,K);
    }
     private int sortUseQuickSort_C(int[] a, int p, int r, int k) {
         int q = partition(a,p,r,k);
        if(q+1 == k ) return a[q]; 
        else if(q+1 > k) return sortUseQuickSort_C(a,p,q-1,k);
        else return sortUseQuickSort_C(a,q+1,r,k);
    }

    private int partition(int[] a, int p, int r, int k) {
        int pivot = a[r];
        int i = p;
        int j = p;
        for(; j< r; j++) {
            if(a[j] > pivot) {
                if(i ==j) {
                    i++;
                } else {
                    swap(a,i,j);
                    i++;
                }
            }
        }
        swap(a,i,r);

        return i;
    }

    private void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

}
全部评论

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
联通 技术人员 总包不低于12
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务