代码如下,作用如标题所述
1 public class HeapSort { 2 //方法作用:取出list里面的最小的 k 个值 3 public static> List sort(List 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 heapList = new ArrayList (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 > void initialHeap(List 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 > void heapify(List list, int n, int i)30 {31 int largest = i; // Initialize largest as root32 int l = 2*i + 1; // left = 2*i + 133 int r = 2*i + 2; // right = 2*i + 234 35 // If left child is larger than root36 if (l < n && (list.get(l).compareTo(list.get(largest)) > 0))37 largest = l;38 39 // If right child is larger than largest so far40 if (r < n && (list.get(r).compareTo(list.get(largest)) > 0))41 largest = r;42 43 // If largest is not root44 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-tree50 heapify(list, n, largest);51 }52 }53 }