找出陣列中第K個最小的數(快速排序)
阿新 • • 發佈:2019-01-10
問題描述:給定一個無序的陣列,從一個數組中找出第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);
}
}