找出陣列的第k大個數
阿新 • • 發佈:2019-01-06
思路:
由於快排每趟排序,排好一個元素、以遞迴的方式、對排好序的元素的兩邊再繼續排序 【前半部分小於當前元素值、後半部分大於當前值】。 查詢第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;
}