程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 堆排序工具類(適用於top k問題,java泛型實現),堆排序工具類

堆排序工具類(適用於top k問題,java泛型實現),堆排序工具類

編輯:JAVA綜合教程

堆排序工具類(適用於top k問題,java泛型實現),堆排序工具類


代碼如下,作用如標題所述

 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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved