使用快速排序的思想实现查找数组中第K大的数
public class Findkth {
public static void main(String[] args) {
int[] arr = {1034406,1010556,968891,937247,986578,1165786};
System.out.println(findKth(arr,arr.length,4));
}
//k是需要查找第K大的数,n代表所有数的个数(这里为了避免多次使用arr.length)
public static int findKth(int[] arr,int n,int k) {
return fastSearch(arr,0,n - 1,k,n);
}
//基于快速排序思想,首先以第一个数为基准查看其在数组中应该存在的位置,如果大于所要查找的数则将大于的部分截去如果小于则将小于的部分截去。然后做一个递归直到所要寻找的数找到它所该在的那个位置停止。有点像二分查找,我们只关心我们所要查找的区间
public static int fastSearch(int[] arr,int start,int end,int k,int n){
int first = start;
int last = end;
int key = first;
int leftMark = 0;
int rightMark = 0;
while(first < last) {
while(first < last && arr[key] <= arr[last]) {
last--;
}
while(first < last && arr[key] >= arr[first]) {
first++;
}
int temp = arr[last];
arr[last] = arr[first];
arr[first] = temp;
}
int temp = arr[start];
arr[start] = arr[first];
arr[first] = temp;
for(int i = start;i <= end;i++) {
System.out.print(arr[i] + ",");
}
System.out.println();
for(int i = 0;i < n;i++) {
if(arr[i] == arr[first] && i < first ) {
leftMark++;
}
if(arr[i] == arr[first] && i > first) {
rightMark++;
}
}
if(first - leftMark<= n - k && n - k <= first + rightMark){
return arr[first];
}else if(first < n - k){
return fastSearch(arr,first + 1,end,k,n);
}else {
return fastSearch(arr,start,first - 1,k,n);
}
}
}