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

 public class HeapSort {
//方法作用:取出list里面的最小的 k 个值
public static <T extends Comparable<T>> List<T> sort(List<T> list, int k) throws Exception {
if (k <= 0) {
throw new Exception("k 必须大于0");
}
if (list.size() < k) {
throw new Exception("list 长度必须大于k");
}
List<T> heapList = new ArrayList<T>(k);
for (int i = 0; i < k; i ++) {
heapList.add(list.get(i));
}
initialHeap(heapList);
for (int i = k; i < list.size(); i ++) {
if (list.get(i).compareTo(heapList.get(0)) < 0) {
heapList.set(0, list.get(i));
heapify(heapList, k, 0);
}
}
return heapList;
}
private static <T extends Comparable<T>> void initialHeap(List<T> list) {
int n = list.size();
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--)
heapify(list, n, i);
}
private static <T extends Comparable<T>> void heapify(List<T> list, int n, int i)
{
int largest = i; // Initialize largest as root
int l = 2*i + 1; // left = 2*i + 1
int r = 2*i + 2; // right = 2*i + 2 // If left child is larger than root
if (l < n && (list.get(l).compareTo(list.get(largest)) > 0))
largest = l; // If right child is larger than largest so far
if (r < n && (list.get(r).compareTo(list.get(largest)) > 0))
largest = r; // If largest is not root
if (largest != i)
{
T swap = list.get(i);
list.set(i, list.get(largest));
list.set(largest, swap);
// Recursively heapify the affected sub-tree
heapify(list, n, largest);
}
}
}

堆排序工具类(适用于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. 关于Pycharm中如何注释

    主要有三种方法: ①在程序行前面加“#” ②将需要注释的代码用'''----''' 包起来,此方法类似C的注释方法 ③将需要注释的代码选住然后利用“Ctrl+/”进行注释 # test=input(' ...

  2. Stars(树状数组单点更新)

    Astronomers often examine star maps where stars are represented by points on a plane and each star h ...

  3. MySql 里的IFNULL、NULLIF、ISNULL和IF用法

    isnull(expr) 的用法: 如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0. 实例: select ISNULL(NULL) 输出结果: ) 输出结果: IFN ...

  4. Python绘图matplotlib

    转自http://blog.csdn.net/ywjun0919/article/details/8692018 Python图表绘制:matplotlib绘图库入门 matplotlib 是pyth ...

  5. 6410裸板程序,led、蜂鸣器、按键…

    //***************************************************************** //作者:昊天 // //功能:在ok6410板子上跑裸板程序, ...

  6. Android输入法部分遮挡UI的问题(与EditText框相切)

    首先,我们来看看遇到问题的图片 遇到的问题是,当点击输入框之后,输入法会切到红线的位置,理想状态应该是在绿线位置 那么,是什么原因造成的呢? 问题其实很简单,是因为drawableleft图片比该输入 ...

  7. ssh时传递环境变量

    设置要传递的变量: -o SendEnv=Varname 但是不是每个都能传,受服务器上sshd_config里的下面两个选项的控制: AcceptEnv and PermitUserEnvironm ...

  8. SQLAlchemy(ORM框架)

    SQLAlchemy SQLAlchemy概述 2 3 4 5 6 7 8 9 10 11 12 13 MySQL-Python     mysql+mysqldb://<user>:&l ...

  9. 在Asp.Net中使用amChart统计图

    怎么在自己的ASP.NET页面插入可动态更新的数据统计图呢?网上的资源倒是不少(Fusioncharts.amCharts……),在这些资源中有一个比较好用:amChart,这个工具很炫,还能与用户交 ...

  10. 使用 Sentry集中处理错误

    Sentry的简介 Sentry 是一个实时的事件日志和聚合平台,基于 Django 构建. Sentry 可以帮助你将程序的所有 exception 自动记录下来,处理 exception 是每个程 ...