import java.util.Arrays;
public class TopK{
public static void main(String[] args){
int [] data = {5,1,2,3,4,0,6,7,8,9};
int k = 1;
FindTopK(data, 0, data.length-1, k-1);
System.out.println(Arrays.toString(data));
System.out.println(data[k-1]);
}
public static void swap(int[] num, int i, int j ){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
public static int pertition(int[] num, int low, int high){
int flag = num[low];
int i = low;
int j = high+1;
while(i<j){
while(++i<=high && num[i]>=flag);
while(--j>=low && num[j]<=flag);
if(i>=j)break;
swap(num, i, j);
}
swap(num, low, i-1);
return i-1;
}
public static void FindTopK(int[] num, int start, int end, int k){
if(start>=end) return;
int flag = pertition(num, start, end);
if(flag == k){
return;
}
else if(flag > k){
FindTopK(num, start, flag-1,k);
}else{
FindTopK(num, flag+1, end, k+start-flag-1);
}
}
}
import java.util.Arrays;
public class TopKWithMinHeap {
public static void main(String[] args) {
int k = 3;
int[] num = {0,9,8,7,6,1,2,3,4,5};
BuildMinHeap(num, k-1);
for(int loop = k; loop<num.length; loop++){
if(num[loop] > num[0]){
swap(num, 0, loop);
}
BuildMinHeap(num, k-1);
}
System.out.println(Arrays.toString(num));
System.out.println(num[0]);
}
public static void swap(int[] num, int i, int j){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
public static void BuildMinHeap(int[] num, int index){
int loop = (index - 1)/2;
for(;loop>=0; loop--){
int innerIndex = loop;
while((innerIndex*2+1)<=index){
int smallerIndex = innerIndex*2+1;
if((innerIndex*2+1)< index){
if(num[innerIndex*2+1]<num[innerIndex*2+2]){
smallerIndex++;
}
}
if(num[innerIndex]>num[smallerIndex]){
swap(num, innerIndex, smallerIndex);
innerIndex = smallerIndex;
}else{
break;
}
}
}
}
}