堆排序算法
时间:2019-01-11
本文章向大家介绍堆排序算法,主要包括堆排序算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package com.xj.www.sort;
/**
* 堆排序算法
*
* @author xiongjing
*
*/
public class HeapSort {
final static int SIZE = 10;
// 堆排序算法具体实现
public static void heap(int a[], int n) {
int i, j, h, k, t;
// 将a[0,n-1]建成大根堆
for (i = n / 2 - 1; i >= 0; i--) {
// 第i个结点有右子树
while (2 * i + 1 < n) {
j = 2 * i + 1;
if ((j + 1) < n) {
// 左子树小于右子树,需要比较右子树
if (a[j] < a[j + 1]) {
// 序号增加1,指向右子树
j++;
}
}
// 比较i与j为序号的数据
if (a[i] < a[j]) {
// 交换数据
t = a[i];
a[i] = a[j];
a[j] = t;
// 堆被破坏,需要重新调整
i = j;
}
// 比较左右子结点均大则堆未破坏,不再需要调整
else {
break;
}
}
}
// 输出构成的堆
System.out.print("原数据构成的堆:");
for (h = 0; h < n; h++) {
System.out.print(" " + a[h]);
}
System.out.println("\n");
for (i = n - 1; i > 0; i--) {
// 与第i个记录交换
t = a[0];
a[0] = a[i];
a[i] = t;
k = 0;
// 第i个结点有右子树
while (2 * k + 1 < i) {
j = 2 * k + 1;
if ((j + 1) < i) {
// 左子树小于右子树,则需要比较右子树
if (a[j] < a[j + 1]) {
// 序号增加1,指向右子树
j++;
}
}
// 比较i与j为序号的数据
if (a[k] < a[j]) {
// 交换数据
t = a[k];
a[k] = a[j];
a[j] = t;
// 堆被破坏,需要重新调整
k = j;
}
// 比较左右子节点均大则未破坏,不需要再调整
else {
break;
}
}
// 输出每步排序的结果
System.out.print("第" + (n - i) + "步排序结果:");
for (h = 0; h < n; h++) {
System.out.print(" " + a[h]);
}
System.out.print("\n");
}
}
// 程序主入口
public static void main(String[] args) {
int[] shuzu = new int[SIZE];
int i;
for (i = 0; i < SIZE; i++) {
shuzu[i] = (int) (100 + Math.random() * (100 + 1));
}
System.out.println("排序前的数组为:");
for (i = 0; i < SIZE; i++) {
System.out.print(shuzu[i] + " ");
}
System.out.print("\n");
heap(shuzu, SIZE);
System.out.println("排序后的数组为:");
for (i = 0; i < SIZE; i++) {
System.out.print(shuzu[i] + " ");
}
System.out.print("\n");
}
}
- 【设计模式】—— 备忘录模式Memento
- 【设计模式】—— 中介者模式Mediator
- 【设计模式】—— 迭代模式Iterator
- 【设计模式】—— 解释器模式Interpret
- 【设计模式】—— 命令模式Commond
- 【设计模式】—— 职责链模式ChainOfResponsibility
- 【设计模式】—— 代理模式Proxy
- 【设计模式】—— 享元模式Flyweight
- 【设计模式】—— 外观模式Facade
- 【设计模式】—— 装饰模式Decorator
- 【设计模式】—— 组合模式Composite
- 【设计模式】—— 桥接模式Bridge
- 【插件开发】—— 1 Eclipse插件开发导盲
- 【插件开发】—— 4 SWT编程须知
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RabbitMQ入门Demo,基于springboot
- 收藏|Pandas缺失值处理看这一篇就够了!
- Spring Boot项目页面报错 OTS parsing error: Failed to convert WOFF 2.0
- Spring Boot开启JSP页面热部署
- Springboot thymeleaf热部署
- Java初始化List的6种方式
- Java遍历Map对象的四种方式
- 【SpringBoot源码解析】第三章:SpringBoot通过打成war包的方式是如何启动的
- 让你编码嗨到停不下来的8个VSCode插件
- 【SpringBoot源码解析】第四章:SpringBoot是如何自动装配SpringMvc的
- 【SpringBoot源码解析】第二章:SpringBoot是如何通过内置Tomcat启动的
- 技术译文 | How Can ScaleFlux Handle MySQL Workload?
- 技术译文 | MySQL 8 需要多大的 innodb_buffer_pool_instances 值(上)
- 前端登录,这一篇就够了
- 技术译文 | MySQL 8 需要多大的 innodb_buffer_pool_instances 值(下)