1. 程式人生 > >找出陣列的第k大個數

找出陣列的第k大個數

思路:

由於快排每趟排序,排好一個元素、以遞迴的方式、對排好序的元素的兩邊再繼續排序
【前半部分小於當前元素值、後半部分大於當前值】。
查詢第k大個元素時,先執行一次快排,判斷排序好的位置、若不為k,比較大於k
第k個元素一定在小於k-1的位置、否則一定在大於k+1的位置
例:
    查詢第k=5大元素
        3 1 4 2 8 5
   1趟   2 1 3 4 8 5      i=2    i+1<k

   2趟  2 1 3 4 8  5      i=3   i+1<k

   3趟  2 1 3 4 5 8       i=5   i+1>5

   4趟  2 1 3 4 5 8        i=4  i+1=5   找到元素為5

注:本排序過程可看做二分法與快排的特點結合
public static  void find(int[] array,int begin,int end,int k){
        int i=partition(array,begin,end);
        //找出i+1大的數與k比較
        if(i+1>k){
            find(array,begin,i-1,k);
        }else if(i+1<k){
            find(array,i+1,end,k);
        }else{
            System.out.println("找到了:"
+array[i]); return; } } //一趟快排 public static int partition(int[] array,int begin,int end){ if(begin<end){ int key=array[begin]; while(begin<end){ while(begin<end&&array[end]>key){ end
--; } if(begin<end){ array[begin]=array[end]; begin++; } while(begin<end&&array[begin]<key){ begin++; } if(begin<end){ array[end]=array[begin]; end--; } } array[begin]=key; } return begin; }