【算法学习】堆排序建立最大堆
本文代码均转自:
作者:早就戒了
来源:CSDN
原文:https://blog.csdn.net/qq_37169817/article/details/79777264
版权声明:本文为博主原创文章,转载请附上博文链接!
1 public class HeapSort { 2 public static int[] maxHeap(int[] array) { 3 // 1.构建大顶堆 4 for (int i = array.length / 2 - 1; i >= 0; i--) { 5 // 从第一个非叶子结点从下至上,对于数组从右至左调整结构 6 adjustHeap(array, i, array.length); 7 } 8 return array; 9 } 10 11 private static void adjustHeap(int[] array, int i, int length) { 12 int parent = array[i]; 13 for (int k = 2 * i + 1; k < length; k = k * 2 + 1) { 14 // 2*i+1表示左节点,k = k * 2 + 1表示继续调整子节点 15 if (k + 1 < length && array[k] < array[k + 1]) 16 k = k + 1;// 找到子节点中更大的节点 17 if (array[k] > parent) { 18 array[i] = array[k];// 父节点变为更大的值 19 i = k;// 修改i的值,使之成爲新的要調整的父節點 20 } else { 21 break;// 表示无需调整,因为是自底向上的 22 } 23 } 24 array[i] = parent;// 将temp值放到最终的位置 25 } 26 27 public static void main(String[] args) { 28 int[] array = { 4, 6, 8, 5, 9 }; 29 int[] maxHeap = maxHeap(array); 30 for (int i : maxHeap) { 31 System.out.print(i + " "); 32 } 33 } 34 }
建大根堆堆思路整理:
1.找到堆中第一个非叶子结点(N0),从它开始调整左右子树。
*第一个非叶子结点的下标为:length/2 -1
*左右子树调整过程:找到其中的较大值结点Ngreater,然后与N0值作比较,如果N0<Ngreater则将两者交换,并继续调整Ngreater的叶子结点(虽然是自底向上调整的,
但是可能在某些parent下降的过程中破坏了底下子树的大小排列规则。)如果N0>=Ngreater直接开始(退出了adjustHeap函数)调整下一个非叶子结点。
2.通过循环调用adjustHeap将所有的非叶子几点调整完成。
堆排序思路:
1.建立初始堆后,将堆顶元素(最大值)与堆中最后一个元素交换,然后调整数组(堆)中的前n-1个元素。(即把数组末尾作为有序区)
2.调整到堆中只剩一个元素时,排序完成。
堆排序代码:
1 public static void sort(int []arr){ 2 //1.构建大顶堆 3 for(int i=arr.length/2-1;i>=0;i--){ 4 adjustHeap(arr,i,arr.length); 5 } 6 //2.调整堆结构+交换堆顶元素与末尾元素 7 for(int j=arr.length-1;j>0;j--){ 8 swap(arr,0,j);//将堆顶元素与末尾元素进行交换 9 adjustHeap(arr,0,j);//重新对堆进行调整 10 } 11 }
转载于:https://www.cnblogs.com/singular/p/10488604.html
【算法学习】堆排序建立最大堆相关推荐
- 算法学习(三)堆排序
要弄清楚堆排序,我们首先要懂得以下两点: 1)逻辑上的结构,怎么样才是一个堆. 2)存储上的结构,一个堆存储起来的结构是怎么样的. 一般来讲,堆排序中的"堆"指的是二叉堆,一种完全 ...
- 算法学习笔记17:堆、堆排序
目录 堆和堆排序:为什么说堆排序没有快速排序快 如何理解"堆" 如何实现一个堆 1. 往堆中插入一个元素 2. 删除堆顶元素 如何基于堆实现排序 1. 建堆 2. 排序 解答开篇 ...
- python堆排序算法_Python算法学习之堆和堆排序
什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种.最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property) ...
- python range倒序_Python算法学习之堆和堆排序
什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...
- 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)
知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...
- 算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...
- Java常见排序算法之堆排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java 堆排序算法_堆排序算法的讲解及Java版实现
这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...
- 算法学习总结(2)——温故十大经典排序算法
一.什么是排序算法 1.1.排序定义 对一序列对象根据某个关键字进行排序. 1.2.排序术语 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排 ...
最新文章
- 管理分布式session的四种方式。
- Vue $nextTick
- java在创建对象时必须_Java中5种创建对象的方式
- 【OJ】洛谷数组题单题解锦集
- mysql表空间自增_Oracle 默认表空间问题及自增变量设置
- python 代码片段23
- MySQL + Atlas --- 部署读写分离
- 抗滑桩初始弹性系数计算_理正岩土常见问题解答(全)
- GLASS数据批量下载
- java 502错误_Spring Boot连接超时导致502错误的实战案例
- 用UWP模仿网易云音乐的动画
- Python里面的编码问题真的让人快疯了.. Python乱码 b'\x1f\x8b\x08\x00\x00\x00\x00\x00\...'
- windows 下搭建邮件服务器
- SpringBoot登录验证码实现
- 2020年度总结 | 葡萄城软件开发技术回顾
- 做事必须搞清10个顺序之我想7.发展:先站住,再站高!
- Android开发各种Utils收集库
- HTC将Viveport推向全球,这是要“反击”Valve的节奏?
- 乔布斯的3个工作技巧:教你如何得到自己想要的
- 使用spring boot实现一个简单的项目——⽤户管理功能
热门文章
- 【翻译】Ext JS 6 Beta发布
- rhino-java中调用javascript
- 侠客X官方网站成立,第一个内测版本即将放出,敬请期待.
- android设备未指定怎么办,APKpath未指定为模块“示例 – 示例”
- 以太坊今日大涨7.5%,芝商所备战“以太坊期货”
- 如何成为软件工程师的团队合作者
- 课程表美化 css_通过这门11小时的免费课程学习HTML和CSS
- win10如何查看NVIDIA驱动的版本
- 获得PMP证书的这一年
- 二、python小功能记录——监听鼠标事件