java heap排序_关于Java排序算法-堆排序(Heap Sort)
堆排序是利用堆的特性进行排序的过程。
堆排序:输出堆顶的最小(大)值后,使剩余的n-1个元素序列重新再建成堆,则可得到原序列的次小(大)值。反复进行可得到一个有序序列,整个过程称为堆排序。
堆排序分为两个步骤:
根据初始输入数据,形成初始堆;
通过一系列的记录交换和重新调整堆进行排序。
public class HeapSort {
// 主函数
public static void main(String[] args) {
int[] arr = { 27, 83, 96, 38, 11, 9 };
sort(arr);
}
// 排序
public static void sort(int[] arr) {
// arr为待排序表, n为表的长度
int n = arr.length;
display("原始数据 : ", arr);
// 建堆函数:根据堆的定义,从最后一个非终端结点(第(n-2)/2个)开始筛选,直至到根结点为止。这一过程使得初始序列 arr[0..n-1] 建成一个堆。
// 构建大顶堆
for (int i = (n - 2) / 2; i >= 0; i--) {
adjustHeap(arr, i, n);
display("构建中: ", arr);
}
display("大顶堆 : ", arr);
// 调整堆结构
// 交换堆顶元素与末尾元素
for (int j = n - 1; j > 0; j--) {
// 将堆顶元素与末尾元素进行交换
swap(arr, 0, j);
// 重新对堆进行调整
adjustHeap(arr, 0, j);
display("排序中: ", arr);
}
display("排序结果: ", arr);
}
// 调整大顶堆
public static void adjustHeap(int[] arr, int i, int length) {
// 先取出当前元素i
int temp = arr[i];
// 从i结点的左子结点开始,也就是2i+1处开始
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
// 如果左子结点小于右子结点,k指向右子结点
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++;
}
// 如果子节点大于父节点,将子节点值赋给父节点。不用进行交换。
if (arr[k] > temp) {
arr[i] = arr[k];
i = k;
} else {
break;
}
}
// 将temp值放到最终的位置
arr[i] = temp;
}
// 交换元素
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// 显示
public static void display(String str, int[] arr) {
System.out.println(str);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
原始数据 :
27 83 96 38 11 9
构建中:
27 83 96 38 11 9
构建中:
27 83 96 38 11 9
构建中:
96 83 27 38 11 9
大顶堆 :
96 83 27 38 11 9
排序中:
83 38 27 9 11 96
排序中:
38 11 27 9 83 96
排序中:
27 11 9 38 83 96
排序中:
11 9 27 38 83 96
排序中:
9 11 27 38 83 96
排序结果:
9 11 27 38 83 96
java heap排序_关于Java排序算法-堆排序(Heap Sort)相关推荐
- 经典排序算法 - 堆排序Heap sort
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...
- java 英文字符串排序_英文字符串排序算法
编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...
- java 桶排序_[图解] 桶排序
桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...
- java字符串排序_对字符串排序持一种宽容的心态
在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码: 上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四.王五.张三,但 ...
- java数组给名字排序_用Java给数组排序
public class BubbleDemo { public static void main(String[] args) { int arr[]={1,3,5,7,2,4,6,8,9}; bu ...
- java 文件内容排序_在Java中对2个大型文本文件进行排序的最佳方法是什么?
我正在构建一个简单的 Java应用程序,涉及从csv文件中读取信息. csv文件中的信息以这种形式出现: "ID","Description" "AB ...
- java字符串数组排序_在Java中对字符串数组进行排序
允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为ArrayL ...
- Java指令屏障_指令重排序和内存屏障
sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...
- java字母排序_【Java】实现按中文首字母排序 | 学步园
要实现"按中文首字母排序"操作,可以使用java.util包下的Arrays类的sort()函数. Arrays类包含用来操作数组(比如排序和搜索)的各种方法. 比如对于排序操作的 ...
最新文章
- mysql div 没有小数,mysql order by limit 的一个坑
- 微众WeCross 跨链平台(3)交易流程
- 《众妙之门——用户体验设计的秘密》一2.3 触摸至上的设计
- 计算机配置扫盲,扫盲了。。怎么识别电脑配置好坏?
- mysql 数据表中查找重复记录(条数)
- 数字视频广播字幕系统(第6.7章)
- 第3章 Hive数据类型
- 使用Keras画神经网络准确性图
- 前端程序员的日常与心酸
- LuatIDE是什么?
- cesium 根据SampledPositionProperty与timeline实现轨迹回放功能(跟随视角、上帝视角) 详细代码与理解记录
- 使用Fiddler和雷电模拟器抓取安卓https请求
- Mixly电子音乐:蜗牛与黄鹂鸟
- 计算机编程专业有哪些好的大学?
- 【程序源代码】外卖侠源码
- The environmenthvariable 'Path' seems to ave some paths containing characters (';', '' or ';;').
- cad怎么画坐标系箭头_怎样用CAD画一个路标箭头?,来学习吧
- SDN控制器的功能及作用—Vecloud
- 在国际化中如何获取当前浏览器的语种
- 七月算法机器学习笔记4 凸优化
热门文章
- 为什么使用 Redis及其产品定位
- nmon--linux压力测试工具
- 网页中Flash播放器常用参数设置(转)
- Vue-Cli4笔记
- python循环体执行的次数与其他不同的是_【单选题】下面Python循环体执行的次数与其他不同的是( )...
- 分布式 集群 系统组件架构_分布式跟踪系统的四个组件如何一起工作
- linux /etc/目录_Linux / etc /目录的版本控制
- summit_Linux注册简介开始,Open Hardware Summit寻求提交,等等
- VSCode自定义代码片段13——Vue的状态大管家
- 第三十四章 批量印刷书籍