本文代码均转自:

作者:早就戒了
来源: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. 各省市数据中心机房工程新建项目汇总(2021年)
  2. 【转】自然语言系列学习之表示学习与知识获取(一)分布式表示
  3. ubuntu10.04下audacious2.4源码编译过程(解决2.3cue的bug)
  4. Servlet使用适配器模式进行增删改查案例(BaseDaoUtilImpl.java)
  5. 从CLI监视OpenJDK
  6. 在屏幕上打印杨辉三角
  7. 我是如何一步步解决问题 让Spring MVC返回HTML类型的视图
  8. xps测试数据处理软件,XPS数据处理时 XPSpeaks 分峰拟合
  9. python基础之列表函数(10)
  10. 关于网络营销基本理论的概述
  11. 十大著名黑客——George Hotz
  12. 2021-04-29【已解决】The server cannot or will not process the request due to something that is perceived
  13. 关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题
  14. 安装VS2019、MFC,并创建MFC工程文件,查看工程信息
  15. 85 R 银行信用卡风控评分数据分析
  16. 苏宁搭台品牌唱戏,净水市场将变天
  17. 金融专业本科生毕业论文选题推荐?
  18. [云原生专题-29]:K8S - 核心概念 - 名字空间/命名空间概念详解与主要操作案例
  19. 【C语言学习笔记】《C程序设计语言》读后感
  20. 纯靠成绩毫无科研的保研历程(电子信息工程专业)

热门文章

  1. 编写矩形类 计算矩形面积
  2. (转).net webconfig使用IConfigurationSectionHandler自定section
  3. 走进Java 7模块系统
  4. Go语言的Channel文章,整个人都感觉不好了
  5. 使用Remix编译和部署以太坊智能合约
  6. sql算术运算符_SQL运算符教程–按位,比较,算术和逻辑运算符查询示例
  7. 愉快的舞会c++_如何在5分钟内建立一个令人愉快的加载屏幕
  8. es6 generator_让我们探索一下ES6 Generators
  9. Hadoop集群搭建(六:HBase的安装配置)
  10. 怎样把字符1变成数字1