本文代码均转自:

作者:早就戒了
来源: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. 算法学习(三)堆排序

    要弄清楚堆排序,我们首先要懂得以下两点: 1)逻辑上的结构,怎么样才是一个堆. 2)存储上的结构,一个堆存储起来的结构是怎么样的. 一般来讲,堆排序中的"堆"指的是二叉堆,一种完全 ...

  2. 算法学习笔记17:堆、堆排序

    目录 堆和堆排序:为什么说堆排序没有快速排序快 如何理解"堆" 如何实现一个堆 1. 往堆中插入一个元素 2. 删除堆顶元素 如何基于堆实现排序 1. 建堆 2. 排序 解答开篇 ...

  3. python堆排序算法_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种.最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property) ...

  4. python range倒序_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...

  5. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  6. 算法学习之快速排序的C语言实现

    近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...

  7. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  8. java 堆排序算法_堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...

  9. 算法学习总结(2)——温故十大经典排序算法

    一.什么是排序算法 1.1.排序定义 对一序列对象根据某个关键字进行排序. 1.2.排序术语 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排 ...

最新文章

  1. 管理分布式session的四种方式。
  2. Vue $nextTick
  3. java在创建对象时必须_Java中5种创建对象的方式
  4. 【OJ】洛谷数组题单题解锦集
  5. mysql表空间自增_Oracle 默认表空间问题及自增变量设置
  6. python 代码片段23
  7. MySQL + Atlas --- 部署读写分离
  8. 抗滑桩初始弹性系数计算_理正岩土常见问题解答(全)
  9. GLASS数据批量下载
  10. java 502错误_Spring Boot连接超时导致502错误的实战案例
  11. 用UWP模仿网易云音乐的动画
  12. Python里面的编码问题真的让人快疯了.. Python乱码 b'\x1f\x8b\x08\x00\x00\x00\x00\x00\...'
  13. windows 下搭建邮件服务器
  14. SpringBoot登录验证码实现
  15. 2020年度总结 | 葡萄城软件开发技术回顾
  16. 做事必须搞清10个顺序之我想7.发展:先站住,再站高!
  17. Android开发各种Utils收集库
  18. HTC将Viveport推向全球,这是要“反击”Valve的节奏?
  19. 乔布斯的3个工作技巧:教你如何得到自己想要的
  20. 使用spring boot实现一个简单的项目——⽤户管理功能

热门文章

  1. 【翻译】Ext JS 6 Beta发布
  2. rhino-java中调用javascript
  3. 侠客X官方网站成立,第一个内测版本即将放出,敬请期待.
  4. android设备未指定怎么办,APKpath未指定为模块“示例 – 示例”
  5. 以太坊今日大涨7.5%,芝商所备战“以太坊期货”
  6. 如何成为软件工程师的团队合作者
  7. 课程表美化 css_通过这门11小时的免费课程学习HTML和CSS
  8. win10如何查看NVIDIA驱动的版本
  9. 获得PMP证书的这一年
  10. 二、python小功能记录——监听鼠标事件