方法一:快排,输入倒数第k个元素;
方法二:维护一个K大小的大根堆;
public class Main {
public static void main(String[] args) {
int[] arr = {16, 7, 3, 20, 17, 8};
int[] heap = new int[3];
for(int i=0; i<3; i++)
heap[i] = arr[i];
heapSort(arr, heap, 3);
System.out.print(heap[0]);
}
private static void heapSort(int[] arr, int[] heap, int k) {
for (int i = (k-1) / 2; i >= 0; i--) { // 小根堆
downHeap(heap, i, k);
}
for (int i = k; i < arr.length; i++) {
if(arr[i] > heap[0]) {
heap[0] = arr[i];
downHeap(heap, 0, k);
}
}
}
public static void downHeap(int[] arr, int parent ,int length) {
int temp = arr[parent];
int childIndex = 2 * parent +1;
while(childIndex < length){
if(childIndex + 1 < length && arr[childIndex + 1 ] < arr[childIndex]) {
childIndex++;
}
if(temp <= arr[childIndex])
break;
arr[parent] = arr[childIndex];
parent = childIndex;
childIndex = 2 * childIndex + 1;
}
arr[parent] = temp;
}
}
方法三:桶排序;
方法四:快排剪枝:
class Solution {
private int Index = 0;
public int findKthLargest(int[] nums, int k) {
return nums[MainSort(nums, k, 0, nums.length-1)];
}
public int MainSort(int[] nums, int k, int p, int q){ //快排
int index = QuickSort(nums, p, q);
if(index+1 == k){
return index;
}
else if(index+1 > k)
return MainSort(nums, k, p, index-1);
else
return MainSort(nums, k, index+1, q);
}
public int QuickSort(int[] nums, int p, int q){ //一次快排
int index = p, flag = q;
for(int i=p; i<q; i++){
if(nums[i] > nums[flag]){
swap(nums, i, index);
index++;
}
}
swap(nums, index, flag);
return index;
}
public void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}