思路:
由于快排每趟排序,排好一个元素、以递归的方式、对排好序的元素的两边再继续排序
【前半部分小于当前元素值、后半部分大于当前值】。
查找第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);
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;
}