1. 程式人生 > >找出陣列中第K個最小的數(快速排序)

找出陣列中第K個最小的數(快速排序)

問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。

演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判斷tmp的位置,如果它的位置為k-1,那麼它就是第k小的數,如果它的位置小於k-1,那麼第k小一定在陣列的右半部分,採用遞迴方法在陣列右半部分繼續查詢;否則第k小在陣列左半部分,採用遞迴方法在左半部分陣列中繼續查詢。

public class Main {

    /**
     * @param args
     */
    public
static int quickSort(int array[],int low,int high,int k){ int i,j; int tmp; if(low>high) return Integer.MIN_VALUE; i=low; j=high; tmp=array[i]; while(i<j){ while(i<j&&array[j]>=tmp) j--; if
(i<j) array[i++]=array[j]; while(i<j&&array[i]<tmp) i++; if(i<j) array[j--]=array[i]; } array[i]=tmp; if(i+1==k) return tmp; else if(i+1>k) return quickSort(array,low,i-1
,k); else return quickSort(array,i+1,high,k); } public static int getKMin(int array[],int k){ if(array==null) return Integer.MIN_VALUE; if(array.length<k) return Integer.MIN_VALUE; return quickSort(array,0,array.length-1,k); } public static void main(String[] args) { // TODO Auto-generated method stub int a[]={1,5,2,6,8,0,6}; int kMin=getKMin(a,6); System.out.println(kMin); } }