JAVA十大排序算法之堆排序详解

编程之家收集整理的这篇文章主要介绍了JAVA十大排序算法之堆排序详解编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这篇文章主要介绍了java中的冒泡排序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考

目录

堆排序

知识补充

二叉树

满二叉树

完全二叉树

二叉堆

代码实现

时间复杂度

算法稳定性

思考

总结

堆排序

这里的堆并不是JVM中堆栈的堆,而是一种特殊的二叉树,通常也叫作二叉堆。它具有以下特点:

它是完全二叉树

堆中某个结点的值总是不大于或不小于其父结点的值

知识补充

二叉树

树中节点的子节点不超过2的有序树

满二叉树

二叉树中除了叶子节点,每个节点的子节点都为2,则此二叉树为满二叉树。

完全二叉树

如果对满二叉树的结点进行编号,约定编号从根结点起,自上而下,自左而右。则深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。

特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。

二叉堆

二叉堆是一种特殊的堆,可以被看做一棵完全二叉树的数组对象,而根据其性质又可以分为下面两种:

大根堆:每一个根节点都大于等于它的左右孩子节点,也叫最大堆

小根堆:每一个根节点都小于等于它的左右孩子节点,也叫最小堆

如果把一个数组通过大根堆的方式来表示(数组元素的值是可变的),如下:

由此可以推出:

对于位置为 k 的节点,其子节点的位置分别为,左子节点 = 2k + 1,右子节点 = 2(k + 1)

如:对于 k = 1,其节点的对应数组为 5

左子节点的位置为 3,对应数组的值为 3

右子节点的位置为 4,对应数组的值为 2

最后一个非叶子节点的位置为 (n/2) - 1,n为数组长度

如:数组长度为6,则 (6/2) - 1 = 2,即位置 2 为最后一个非叶子节点

给定一个随机数组[35,63,48,9,86,24,53,11],将该数组视为一个完全二叉树:

从上图很明显的可以看出,这个二叉树不符合大根堆的定义,但是可以通过调整,使它变为最大堆。如果从最后一个非叶子节点开始,从下到上,从右往左调整,则:

通过上面的调整,该二叉树为最大堆,这个时候开始排序,排序规则:

将堆顶元素和尾元素交换交换

后重新调整元素的位置,使之重新变成二叉堆

代码实现

public class HeapSort { public static final int[] ARRAY = {35, 63, 48, 9, 86, 24, 53, 11}; public static int[] sort(int[] array) { //数组的长度 int length = array.length; if (length 0) {//当lenth = 0; i--) { //调整使之成为最大堆 adjustHeap(array, i, array.length); } } /** * 调整 * @param parent 最后一个非叶子节点 * @param length 数组的长度 */ private static void adjustHeap(int[] array, int parent, int length) { //定义最大值的索引 int maxIndex = parent; //parent为对应元素的位置(数组的索引) int left = 2 * parent + 1;//左子节点对应元素的位置 int right = 2 * (parent + 1);//右子节点对应元素的位置 //判断是否有子节点,再比较父节点和左右子节点的大小 //因为parent最后一个非叶子节点,所以如果有左右子节点则节点的位置都小于数组的长度 if (left array[maxIndex]) {//左子节点如果比父节点大 maxIndex = left; } if (right array[maxIndex]) {//右子节点如果比父节点大 maxIndex = right; } //maxIndex为父节点,若发生改变则说明不是最大节点,需要交换 if (maxIndex != parent) { swap(array, maxIndex, parent); //交换之后递归再次调整比较 adjustHeap(array, maxIndex, length); } } //交换 private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void print(int[] array) { for (int i : array) { System.out.上一篇:Java中自己如何实现log2(N)下一篇:JAVA十大排序算法之希尔排序详解 热门搜索

堆排序算法 

堆排序 

java排序 

归并排序、堆排序 

java冒泡排序算法 

相关文章

Java排序算法总结之堆排序

2021-10-10阅读(5761)评论(0)推荐()

这篇文章主要介绍了Java排序算法总结之堆排序,详细分析了堆排序的原理与java实现技巧,需要的朋友可以参考下

Java 归并排序算法、堆排序算法实例详解

2021-09-18阅读(9657)评论(0)推荐()

这篇文章主要介绍了Java 归并排序算法、堆排序算法实例详解,需要的朋友可以参考下

PHP排序算法之堆排序(Heap Sort)实例详解

2021-11-11阅读(6171)评论(0)推荐()

这篇文章主要介绍了PHP排序算法之堆排序(Heap Sort),结合实例形式详细分析了堆排序的原理、实现方法及相关使用注意事项,需要的朋友可以参考下

Python排序搜索基本算法之堆排序实例详解

2021-11-04阅读(9464)评论(0)推荐()

这篇文章主要介绍了Python排序搜索基本算法之堆排序,结合实例形式详细分析了堆排序的原理、Python实现方法及相关操作注意事项,需要的朋友可以参考下

C++堆排序算法实例详解

2021-10-06阅读(6169)评论(0)推荐()

这篇文章主要介绍了C++堆排序算法,简单分析了堆排序算法的原理并结合实例形式分析了C++实现堆排序的具体操作技巧,需要的朋友可以参考下

C#排序算法之堆排序

2021-10-06阅读(6122)评论(0)推荐()

这篇文章主要为大家详细介绍了C#排序算法之堆排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

JAVA算法起步之堆排序实例

2021-09-20阅读(8486)评论(0)推荐()

这篇文章主要介绍了JAVA算法起步之堆排序实例,需要的朋友可以参考下

取消

有人回复邮件通知

提交评论

© 2021 编程之家 

工信部备案号:琼ICP备2022000316号

总结

以上是编程之家为你收集整理的JAVA十大排序算法之堆排序详解全部内容,希望文章能够帮你解决JAVA十大排序算法之堆排序详解所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

Java相关文章

使用SpringBoot2.x配置静态文件缓存
Java动态代理四种实现方式详解
Eclipse开发JavaWeb项目配置Tomcat的方法步骤
详解领域驱动设计之事件驱动与CQRS
SpringBoot全局配置long转String丢失精度的问题解决
springboot yml定义属性,下文中${} 引用说明
IDEA解决Java:程序包xxxx不存在的问题
编程语言榜单Java与Python并列第二!Julia下滑
MyBatis Log 插件无法显示SQL语句的原因解析
jsp response.sendRedirect()用法详解
使用springboot访问图片本地路径并映射成url
springboot文件虚拟路径映射方式