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

  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泛型实现)的更多相关文章

  1. 正则表达式工具类,正则表达式封装,Java正则表达式

    正则表达式工具类 正则表达式封装 Java正则表达式 >>>>>>>>>>>>>>>>>>& ...

  2. 利用JDBC工具类添加和查询数据-Java(新手)

    JDBC工具类: 1 package cn.lxr.jdbclx; 2 3 import java.sql.*; 4 5 public class JDBCUtils { 6 private stat ...

  3. java工具类(一)之服务端java实现根据地址从百度API获取经纬度

    服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...

  4. JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)

    一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...

  5. HttpTool.java(在java tool util工具类中已存在) 暂保留

    HttpTool.java 该类为java源生态的http 请求工具,不依赖第三方jar包 ,即插即用. package kingtool; import java.io.BufferedReader ...

  6. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  7. Java并发之CountDownLatch工具类

    一.CountDownLatch工具类介绍 CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作.假设我们有这样的一 ...

  8. Java并发之CyclicBarrier工具类

    一.CyclicBarrier工具类介绍 在上一篇文中我们介绍到了CountDownLatch工具类,其实CyclicBarrier和CountDownLatch工具类实现的功能差不多.我们可以从字面 ...

  9. Java Utils工具类大全(转)

    源码和jar见:https://github.com/evil0ps/utils #Java Utils --- 封装了一些常用Java操作方法,便于重复开发利用. 另外希望身为Java牛牛的你们一起 ...

随机推荐

  1. linux的学习在runoob.com网站

    学习位置: Shell 变量

  2. Python中的闭包与迭代器

    前面内容补充 函数名分应用(第一类对象) 函数名的命名规范与变量命名是一样的函数名其实就是变量名 函数名可以作为列表中的元素进行存储 例如: def func1(): pass def func2() ...

  3. redis实现发布订阅

    订阅者 #!/usr/bin/env python # -*- coding:utf-8 -*- import redis r = redis.Redis(host='192.168.11.119') ...

  4. jmeter beanshell

    //获取返回数据 String json = prev.getResponseDataAsString(); ///加入变量vars.put("restr",json); //获取 ...

  5. 使用Apache IO库操作IO与文件

    --------------siwuxie095                         首先到 Apache官网 下载相关的库文件     Apache官网:http://www.apach ...

  6. Java AOP 注解配置与xml配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. DBMS ODBC JDBC是什么?

    昨天躺在被窝里面看了几页电子书,今天写下来. 数据库就是存放数据的仓库. DBMS的意思是数据库管理系统,作用就是“管理”数据库的.“管理”这两个字简单说来就是“增删改查”.所以DBMS就是能够对数据 ...

  8. java中的监听事件

    java监听器实现的类 1.ServletContextListener:对servlet上下文的创建和销毁监听 2.ServletContextAttributeListener:监听servlet ...

  9. 自定义JTabbedPane 标签风格

    自定义JTabbedPane 标签风格 2012年03月09日 20:33:12 阅读数:2435 demo 下载地址:http://download.csdn.net/detail/jinannan ...

  10. ssh试卷

    2.简述Hibernate的工作原理. 答:首先,Configuration读取Hibernate的配置文件及映射文件中的信息,即加载配置文件和映射文件,并通过Hibernate配置文件生成一个多线程 ...