堆排序工具类(适用于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 }
时间: 2024-12-28 21:04:19

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

Top K以及java priorityqueue

Top K问题比较常见啦,这里总结一下方法. 1.用最小堆来做. 思路是先利用数组中前k个数字建一个最小堆,然后将剩余元素与堆顶元素进行比较,如果某个元素比堆顶元素大,就替换掉堆顶元素,并且重新调整成最小堆. 到这里,堆中保存着的其实是前k个最大的数字.堆顶就是第K个最大的数字.这样前k个,第k个都可以求出来了.代码如下: 1 public void find(int[] nums, int k){ 2 PriorityQueue<Integer> priorityQueue = new Pr

Java Utils工具类大全

源码和jar见:https://github.com/evil0ps/utils #Java Utils --- 封装了一些常用Java操作方法,便于重复开发利用. 另外希望身为Java牛牛的你们一起测试和完善,欢迎入群263641914 一起封装和完成常用的Java代码. 节约撸码时间以方便有更多的时间去把妹子- #开发环境 Win7x64 JDK1.7 IDEA14 #项目结构 │ README.md │ utils.iml │ ├─.idea │ ├─conf │ configFTP.pr

汉语转拼音(全转与只转首个字母)工具类

1.全转的工具类 ChineseConvertAll.java package Utils.Chinese; /** * 将中文词组转换成拼音 * @author mei * */ public class ChineseConvertAll { private static int[] pyvalue = new int[] { -20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20

7.8 操作集合的工具类:Collections

目录 一.排序操作 二.查找和替换功能 三.同步控制 四.设置不可变集合 五.Java 9新增的不可变集合 一.排序操作 Collections提供了如下常用类方法用于对List集合进行排序: ★void reverse(List list):反转指定的List集合中的元素顺序. ★void shuffle(List list):对Lsit集合中的元素进行随机排序(shuffle方法模仿了"洗牌"动作). ★void sort(List list):根据元素的自然顺序对指定集合元素按升

Top k 问题

Top K的问题: 给出大量数据,找出其中前K个最大(小)的数,或者在海量数据中找到出现频率最好的前K个数. 一.给出大量数据(N个),找出其中前K个最大数(没有其他资源上的限制) 1.使用排序算法 直接使用排序算法,如快速排序,然后遍历找到最大的K个数.时间复杂度为O(NlogN): 2.部分排序 因为,只要求出前K个最大值,所以我们不必全部排好.思路是:随意选出K个数形成一个数组,然后按从大到小进行排序,再从剩下的数中,选取一个数和数组中的最小值进行比较,若小于最小值,则取下一个数继续比较:

FilenameUtils工具类【转载】

!!!转载 FilenameUtils工具类 博客分类: java FilenameUtilscommon-io 转载请出自出处:http://eksliang.iteye.com/blog/2217081 一.概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到. 非

黑马程序员——工具类Collections的使用

工具类Collections的使用 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class CollectionsDemos { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<String> al = new ArrayList

配置文件或者模板中的占位符替换工具类

有时候.非常多文本存入数据库或者文件里,某些变量或者模板中会存在占位符的情况,然而每次读取,一个个去字符串.replace去替换就非常麻烦,于是写个占位符替换工具类 详细代码: import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 配置文件或模板中的占位符替换工具类 * Date: 15-5-8 * Time: 下午4:12 */

工具类:Date

Date/SimpleDateFormat/Calendar:与时间相关的一些工具类 代码实例: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class TestSimpleDateFormat { public static void main(String[] args) throws P