码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-04-14 22:04:14      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:class   sort   add   return   堆排序   throw   工具类   size   compareto   

代码如下,作用如标题所述

 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泛型实现)

标签:class   sort   add   return   堆排序   throw   工具类   size   compareto   

原文地址:http://www.cnblogs.com/Michaelwjw/p/6711115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!