import java.util.Arrays;
import java.util.Scanner;
public class A016_TopK和小顶堆 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[10];
while (true) {
int n = sc.nextInt();
if (n == -1)
break;
if (arr[arr.length - 1] < n) {
arr[arr.length - 1] = n;
}
sort(arr, n);
System.out.println(Arrays.toString(arr));
}
int k = sc.nextInt();
System.out.println(arr[k - 1]);
}
public static void sort(int[] arr, int n) {
makeMinHeap(arr);
int len = arr.length - 1;
for (int i = len; i >= 0; i--) {
int t = arr[0];
arr[0] = arr[i];
arr[i] = t;
MinHeap(arr, 0, i);
}
}
public static void makeMinHeap(int[] arr) {
for (int i = arr.length / 2; i >= 0; i--)
MinHeap(arr, i, arr.length);
}
public static void MinHeap(int[] arr, int i, int n) {
int left = i * 2 + 1;
int right = i * 2 + 2;
if (left >= n)
return;
int min = left;
if (right < n)
if (arr[min] >= arr[right])
min = right;
if (arr[i] <= arr[min])
return;
int t = arr[i];
arr[i] = arr[min];
arr[min] = t;
MinHeap(arr, min, n);
}
}
小堆排序就和之前的一样,因为小顶堆后输出的数组是从大到小的,所以求连续输出的数组中第k大的数,就可以用小顶堆来实现。
1、首先判断新输入的这个数,是不是比数组的最后一个元素大,如果是,那就把这个数放入,然后和之前生成有序小顶堆的函数一样,生成并排序。
2、输入-1的时候,结束输入,然后输出数组中下标第k-1个数,就是第k个数了
如果不知道小顶堆的堆排序的话,可以看这个:
三、排序_06 &大顶堆小顶堆 &堆排序(笔记)