堆排序工具类(适用于top k问题,java泛型实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序工具类(适用于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 }

 

以上是关于堆排序工具类(适用于top k问题,java泛型实现)的主要内容,如果未能解决你的问题,请参考以下文章

排序算法堆排序及有界堆排序Java实现及分析

Java 之 泛型擦除

Java泛型

[ 数据结构 -- 手撕排序算法第七篇 ] 堆排序(下)用堆排序来解决Top-K问题

Java连载92-Collections工具类泛型初步

Top K以及java priorityqueue