代碼如下,作用如標題所述
1 public class HeapSort {
2 //方法作用:取出list裡面的最小的 k 個值
3 public static <T extends Comparable<T>> List<T> sort(List<T> list, int k) throws Exception {
4 if (k <= 0) {
5 throw new Exception("k 必須大於0");
6 }
7 if (list.size() < k) {
8 throw new Exception("list 長度必須大於k");
9 }
10 List<T> heapList = new ArrayList<T>(k);
11 for (int i = 0; i < k; i ++) {
12 heapList.add(list.get(i));
13 }
14 initialHeap(heapList);
15 for (int i = k; i < list.size(); i ++) {
16 if (list.get(i).compareTo(heapList.get(0)) < 0) {
17 heapList.set(0, list.get(i));
18 heapify(heapList, k, 0);
19 }
20 }
21 return heapList;
22 }
23 private static <T extends Comparable<T>> void initialHeap(List<T> list) {
24 int n = list.size();
25 // Build heap (rearrange array)
26 for (int i = n / 2 - 1; i >= 0; i--)
27 heapify(list, n, i);
28 }
29 private static <T extends Comparable<T>> void heapify(List<T> list, int n, int i)
30 {
31 int largest = i; // Initialize largest as root
32 int l = 2*i + 1; // left = 2*i + 1
33 int r = 2*i + 2; // right = 2*i + 2
34
35 // If left child is larger than root
36 if (l < n && (list.get(l).compareTo(list.get(largest)) > 0))
37 largest = l;
38
39 // If right child is larger than largest so far
40 if (r < n && (list.get(r).compareTo(list.get(largest)) > 0))
41 largest = r;
42
43 // If largest is not root
44 if (largest != i)
45 {
46 T swap = list.get(i);
47 list.set(i, list.get(largest));
48 list.set(largest, swap);
49 // Recursively heapify the affected sub-tree
50 heapify(list, n, largest);
51 }
52 }
53 }