Java实现堆排序
时间:2020-05-20
本文章向大家介绍Java实现堆排序,主要包括Java实现堆排序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class HeapSort implements SortAlgorithm {
@Override
public void sort(int[] nums) {
if (nums == null || nums.length == 0) return;
// 构建最大堆
buildMaxHeap(nums);
int heapSize = nums.length;
while (heapSize > 1) {
// 交换堆顶和堆尾的两个元素
swap(nums, h2a(1), h2a(heapSize));
// 堆的大小-1
--heapSize;
// 调整堆顶元素
heapify(nums, heapSize, 1);
}
System.out.println("heap sort:" + Arrays.toString(nums));
}
// 构建最大堆
private void buildMaxHeap(int[] nums) {
for (int i = nums.length / 2; i >= 1; --i) {
heapify(nums, nums.length, i);
}
System.out.println("max heap: " + Arrays.toString(nums));
}
// 对元素i进行调整,以维护最大堆的性质
// 原数组元素下标从0开始,需要从1开始
private void heapify(int[] nums, int heapSize, int heapIndex) {
// 如果是叶子节点,则不需要调整
if (heapIndex > heapSize / 2) return;
// 如果有孩子节点
int leftChildIndex = 2 * heapIndex;
int rightChildIndex = leftChildIndex + 1;
// 找出父节点以及左右孩子节点中的最大者
int largestIndex = nums[h2a(heapIndex)] >= nums[h2a(leftChildIndex)] ? heapIndex : leftChildIndex;
if (rightChildIndex <= heapSize && nums[h2a(rightChildIndex)] > nums[h2a(largestIndex)]) {
largestIndex = rightChildIndex;
}
// 如果父节点的值不是最大
if (heapIndex != largestIndex) {
// 交换两个元素
swap(nums, h2a(heapIndex), h2a(largestIndex));
// 递归调整
heapify(nums, heapSize, largestIndex);
}
}
// 交换数组中两个元素
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
// 将堆的编号转化为数组下标
private int h2a(int heapIndex) {
return heapIndex - 1;
}
public static void main(String[] args) {
int[] nums = new int[]{7, 5, 6, 9, 11, 2, 7};
new HeapSort().sort(nums);
}
}
原文地址:https://www.cnblogs.com/SanjiApollo/p/12922580.html
- spring cloud 学习(3) - feign入门
- Java集合源码分析(四)HashMap
- Java魔法堂:解读基于Type Erasure的泛型
- 显示mybatis的执行的sql
- spring cloud 学习(2) - eureka server注册中心高可用及安全认证
- mybatis在xml文件中处理大于号小于号的方法
- kafka集群部署
- Hadoop(九)Hadoop IO之Compression和Codecs
- 安卓第二夜 有趣的架构
- spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
- 简明 Git 命令速查表
- spring cloud 学习(8) - sleuth & zipkin 调用链跟踪
- 快速学习Bash
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python爬虫练习 爬取网络小说保存到txt
- Python爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战
- Python matplotlib数据可视化 subplot绘制多个子图
- python pathlib模块的基本使用和总结
- Python 爬取前程无忧最新招聘数据 matplotlib数据分析与可视化
- Python opencv图像处理基础总结(一)
- Python opencv图像处理基础总结(二) ROI操作与泛洪填充 模糊操作 边缘保留滤波EPF
- python asyncio+aiohttp异步请求 批量快速验证代理IP是否可用
- python pyecharts数据可视化 玫瑰图、柱形图、饼图、环图
- Python opencv图像处理基础总结(三) 图像直方图 直方图应用 直方图反向投影
- Python opencv图像处理基础总结(四) 模板匹配 图像二值化
- python pyecharts数据可视化 词云图 仪表盘 水球图
- python jupyter notebook配置 更改默认工作目录 更换皮肤主题 代码字体 大小
- 关于直播卖货系统平台在微信浏览器中音视频播放的问题
- python爬虫 scrapy爬虫框架的基本使用