public class TopK_HeapSort {
public static void main(String[] args) {
int[] data = new int[]{100,1,3,4,2,8,9,5,6,7,32,56,99,3,4,8,7,23,87,32,4,6};
int kthLargest = findKthLargest(data, 6);
System.out.println(kthLargest);
}
public static int findKthLargest(int[] nums, int k) {
int[] tree = new int[k];
for(int i=0; i<k; i++) {
tree[i] = nums[i];
}
head(tree, k);
for(int i=k; i<nums.length; i++) {
if(tree[0] < nums[i]) {
tree[0] = nums[i];
adjustTree(tree, k, 0);
}
}
return tree[0];
}
public static void head(int[] tree, int k) {
for(int i=(k-1)/2; i>=0; i--) {
adjustTree(tree, k, i);
}
}
public static void adjustTree(int[] tree, int k, int i) {
if(i >= k) {
return;
}
int left = 2*i+1;
int right = 2*i+2;
int min = i;
if(left < k && tree[left] < tree[min]) {
min = left;
}
if(right < k && tree[right] < tree[min]) {
min = right;
}
if(min != i) {
swap(tree, min, i);
adjustTree(tree, k, min);
}
}
public static void swap(int[] tree, int i, int j) {
int temp = tree[i];
tree[i] = tree[j];
tree[j] = temp;
}
}