排序算法Java代码实现(六)—— 堆排序
本片内容:
- 堆排序
堆排序
最大堆:
二叉堆是完全二叉树或者是近似完全二叉树,
当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。(父节点大于任何一个子节点)
算法思想:
- 把n个元素建立最大堆,把堆顶元素A[0]与待排序序列的最后一个数据A[n-1]交换;
- 把剩下的n-1个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-2]交换;
- 把剩下的n-2个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-3]交换;
重复以上步骤,直到把最后两个元素建成最大堆并进行交换,得到的序列就是排序后的有序序列。
代码实现:
/**
*
*/
package com.cherish.SortingAlgorithm; /**
* @author acer
*
*/
public class Chapter_7_堆排序 extends ArrayBase { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] array = new int[] {3,4,7,9,2,5,1,8,6};
heapSorting(array);
printArray(array); } //堆排序
public static void heapSorting(int[] array)
{
int arrayLength = array.length;
//循环建堆
for(int i = 0;i < arrayLength-1;i++)
{
//建堆,建一次最大堆,寻找一个待排序列的最大数
buildMaxHeap(array,arrayLength-1-i);
//交换堆顶元素(带排序序列的最大数)和最后一个元素 array[0]是堆顶
swap(array,0,arrayLength-1-i); }
} //建最大堆
public static void buildMaxHeap(int[] array,int lastIndex)
{
//从最后一个节点(index)的父节点开始
for(int i = (lastIndex-1)/2 ; i >= 0; i--)
{
//k 保存正在判断的节点
int k = i;
//如果当前k节点的子节点存在
while(k*2+1 <= lastIndex)
{
//k节点的左子节点的索引
int biggerIndex = 2*k + 1;
//如果k节点的左子节点biggerIndex小于index,即biggerIndex+1代表的k节点的右子节点存在
if(biggerIndex < lastIndex)
{
//若右子节点的值较大
if(array[biggerIndex]<array[biggerIndex + 1])
{
//biggerIndex总是记录较大子节点的索引
biggerIndex = biggerIndex + 1;
}
}
//如果k节点的值小于其较大的子节点的值,交换他们
if(array[k] < array[biggerIndex])
{
swap(array,k,biggerIndex);
//将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
k = biggerIndex;
}else
{
//当前判断节点k(父节点)大于他的两个子节点时,跳出while循环
break;
} }
}
}
}
实现结果:

由上图可以看到,每次建立最大堆时,最大的数都在array[0],下一次建堆时,上一个最大的数已经移到数组尾部了。
排序算法Java代码实现(六)—— 堆排序的更多相关文章
- 排序算法Java代码实现(一)—— 选择排序
以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...
- 八大排序算法java代码
1.冒泡排序 public static void main(String[] args) { int[] arr = {1,4,2,9,5,7,6}; System.out.println(&quo ...
- 排序算法Java代码实现(三)—— 插入排序 和 希尔排序
因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序 ...
- 排序算法Java代码实现(四)—— 归并排序
本篇内容: 归并排序 归并排序 算法思想: 将两个或两个以上的有序表合并成一个新的有序表, 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列. 此算法分为两步: ...
- 排序算法Java代码实现(五)—— 快速排序
本篇内容: 快速排序 快速排序 算法思想: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排 ...
- 排序算法Java代码实现(二)—— 冒泡排序
本篇内容: 冒泡排序 冒泡排序 算法思想: 冒泡排序的原理是:从左到右,相邻元素进行比较. 每次比较一轮,就会找到序列中最大的一个或最小的一个.这个数就会从序列的最右边冒出来. 代码实现: /** * ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- 专题 查找与排序的Java代码实现(一)
专题 查找与排序的Java代码实现(一) 查找(Searching) 线性查找(linear search) 属于无序查找算法,适合于存储结构为顺序存储或链接存储的线性表. 基本思想:从数据结构线形表 ...
- Java实现八种排序算法(代码详细解释)
经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...
随机推荐
- day 36
目录 pymysql操作mysql 安装 连接 增 删 改 查 索引 为什么使用索引以及索引的作用 类比 索引的本质 索引的底层原理 索引的种类(重点) 主键索引 唯一索引 普通索引 索引的创建 主键 ...
- iptables 学习笔记
1. 安装iptables yum install iptables centos7: yum install -y iptables-services 2. service命令 查看iptables ...
- 简易解说拉格朗日对偶(Lagrange duality)(转载)
转载自https://www.cnblogs.com/90zeng/p/Lagrange_duality.html,本人觉得讲的非常好! 1.原始问题 假设是定义在上的连续可微函数(为什么要求连续可微 ...
- JS高阶---作用域面试
面试题1: ,答案为10 有一点需要明确:作用域是在定义编写代码时已经决定好的 面试题2: 结果1: 结果2: 首先在内部作用域找,没有 然后在全局作用域找,window没有,所以会报错 如果想找对象 ...
- VC 静态库与动态库(二)静态库创建与使用
1.新建项目,创建项目和解决方案 StaticLibrary 这是静态库项目 G:\C++Learn\Library Library文件夹用于存放库相关文件,包含静态库与后面的动态库工程和解决方案 ...
- MySQL数据库 介绍,安装,基本操作
- 数据库介绍: 1.随意存放在一个文件中的数据,数据的格式千差万别 tank|123 jason:123 sean~123 2.软件开发目录规范 - Project: - conf - bin - ...
- USACO Pearl Pairing
洛谷 P2902 [USACO08MAR]珍珠配对Pearl Pairing https://www.luogu.org/problem/P2902 JDOJ 2577: USACO 2008 Mar ...
- Shell变量——用户变量
1.Shell变量: (1)命令规则:由数字.字母.下划线组成,首字符不能为数字. (2)变量的默认类型都是字符串型,对于数值类型,则必须进行指定. (3)大小写敏感的,例如:ASD.asd.Asd是 ...
- MyEclipse10破解 运行run.bat闪退 亲自试验
找到MyEclipse安装的自带的jdk(方法是打开MyEclipse,依次window->Preferences->Java->Installed JRES找到默认路径,我的是:自 ...
- 使用async-profiler简单分析zeebe 工作流引擎的性能
刚开始的时候直接使用的系统暴露的prometheus metrics,发现越高的版本反而性能越差,期间使用过了 perf 打算使用perf 生成火焰图的,但是因为符号缺失,只找到了占用较高的任务,详细 ...