找出數組中的第K大的元素

問題描述

找出數組中的第K大的元素,時間複雜度爲O(n)

代碼

public class FindK {
    //隨機取一個基準數pivot,然後遍歷數組一次,比基準數大的逐一的放在最前面,最後返回基準數的位置
    //並且次基準數在a[left...right]中是第(k-left+1)大的元素
    public static int randomPartition(int[] a,int left,int right){
        int pivot=a[right],k=left-1;
        for(int i=left;i<=right;i++){
            if(a[i]>pivot){
                int temp=a[i];
                a[i]=a[++k];
                a[k]=temp;
            }
        }

        int t=a[right];
        a[right]=a[++k];
        a[k]=t;

        return k;
    }
    //得到第K大的元素
    public static int getMaxK(int[] a,int k,int left,int right){
        int maxK=randomPartition(a,left,right);
        //num表示是第a[maxK]是第num大
        int num=maxK-left+1;
        if(num==k)
            return a[maxK];
        else if(num<k)
            return getMaxK(a,k-num,maxK+1,right);
        else
            return getMaxK(a,k,left,maxK-1);
    }
    //驗證
    public static void main(String[] args) {
        int[] a={12012, 3, 945, 965, 66, 232, 65, 7, 8, 898, 56, 878, 170, 13, 5};

        //依次求出第i大的元素最後打印的結果是降序排列
        for(int i=0;i<a.length;i++){
            System.out.println(getMaxK(a,i+1,0,14));
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章