本文是学习了左神教学视频后编码完成的,相对于上一篇堆排序算法Algorithm-排序算法-堆排序_lreis2010-CSDN博客过程更加清晰简练,可以先通过上一篇文章了解原理,再来学习这个算法的具体实现。

1.构建最大堆

在堆中插入一个新的元素,需要判断该元素与父节点之间的大小关系进行适当的调整,保证当前数据结构是一个最大堆。

构建最大堆的过程是一个自下而上的调整过程。

    // 插入新的数,调整堆为最大堆// 自下而上的调整private void heapInsert(int[]arr, int index){int parent = (index - 1) / 2;while (arr[index] > arr[parent]){// 子节点的值大于父节点swap(arr, index, parent);index = parent;parent = (index - 1) /2;}}

2.删除一个节点

删除一个节点的过程是将队尾元素与要删除的节点进行交换,同时减少堆的大小,遮盖被交换出去数据的存在。

原来的队尾元素插入到新的位置后,需要进行一次自上而下的调整,重新构建最大堆。

    // 某个数在index位置,向下移动保持最大堆// 自上而下的调整private void heapfy(int[]arr, int index, int heapSize){int left = index * 2 + 1;// 如有有子孩子就判断while (left < heapSize){// 左右子节点之间比较最大值int largest = (left + 1 < heapSize && arr[left] < arr [left +1])?  left + 1 : left;// 父子之间比较最大值largest = arr[largest] > arr[index] ? largest : index;// 父节点已经是最大值if (largest == index){break;}swap(arr, index, largest);index = largest;left = index * 2 + 1;}}

3.堆排序

堆排序是基于以上两个过程的,整体过程包括

  • 构建最大堆
  • 将最大堆的队头元素和队尾元素交换位置,完成最大值的排序,并重新调整数组为最大堆
  • 重复第二步,直到排序完成。
    // 堆排序private void heapSort(int[]arr){if (arr == null || arr.length < 2){return;}// 构建最大堆int heapSize = arr.length;for (int i = 0; i< heapSize; i++){heapInsert(arr, i);}while (heapSize > 0){// 将最大值移动到队列尾部并遮蔽最大值swap(arr, 0, --heapSize);// 队尾写入对头,自上而下调整为最大堆heapfy(arr, 0, heapSize);}}

Algorithm-左程云-堆排序相关推荐

  1. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  2. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  3. leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)

    题目 https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/ 题解 重叠区间问题可以总结为在坐标轴上若干个位 ...

  4. CSDN专访左程云,算法之道

    算法的庞大让很多人畏惧,程序员如何正确的学习并应用于面试.工作中呢?今天,CSDN邀请了IBM软件工程师.百度软件工程师.刷题5年的算法热爱者左程云,来担任CSDN社区问答栏目的第二十六期嘉宾,届时会 ...

  5. 左程云:程序员该如何学习算法?

    大家好,我是左程云.我本科就读于华中科技大学.硕士毕业于在芝加哥大学.先后在IBM.百度.GrowingIO和亚马逊工作,是一个刷题7年的算法爱好者. 我是<程序员代码面试指南--IT名企算法与 ...

  6. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  7. 【左程云Java算法】Chapter1-5:用一个栈实现另一个栈的排序

    [左程云Java算法]Chapter1-5:用一个栈实现另一个栈的排序 [题目] 用一个栈实现另一个栈的排序 [要求] 一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个 ...

  8. 左程云基础班——二叉树

    左程云基础班--二叉树 1. 遍历二叉树 二叉树结点: public class Node {public int value;public Node left;public Node right;p ...

  9. 左程云算法笔记(四)哈希表和有序表的使用、链表

    左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...

  10. 数据结构与算法XS班-左程云第八节课笔记(归并排序和快速排序)

    第8节 归并排序和快速排序 ##这是数据结构与算法新手班-左程云第八节课的笔记## 归并排序 归并排序实际上是一个很经典的排序方法,时间复杂度o(N*logN). 递归版本(图解排序算法(四)之归并排 ...

最新文章

  1. 2021年春季学期-信号与系统-第三次作业参考答案-第八道题
  2. mysql5.6.7多实例安装、配置的详细讲解分析及shell启动脚本的编写
  3. opencv的K近邻算法
  4. Ubuntu16.04 下 Python3 虚拟环境安装 OpenCV
  5. 【NOSQL 】 memcache 安装及配置分布式集群 双向复制
  6. python中的正则表达式是干嘛的_操作python中的正则表达式(上)
  7. php 查询方法all,获取多条:all静态方法
  8. Tcl与Design Compiler (十二)——综合后处理
  9. shiro框架---关于多项目之间验证为什么需要共享session
  10. 【JavaScript】用Switch实现成绩等级判断
  11. PHP案例:数组用法演示
  12. java对list里面按照分数排名_提前批警校排名,部属警校去省厅,省级警校去乡镇吗...
  13. 【白皮书下载】2020年数字营销与商业增长白皮书.pdf
  14. ueditor+asp.net异步提交,可以实现了,嘿嘿
  15. 技术,要拿得起,更要放得下
  16. 全平台adb工具安装方法
  17. 利用cmd(命令提示符)taskkill结束进程的方法(命令结束进程)
  18. 矩阵的初等变换与线性方程组
  19. Redis设置过期时间
  20. 黑群晖vmm专业版_群晖的ABB应用不错,但必须吐槽群晖 VMM功能,让你看看就是不让你好好用!!!...

热门文章

  1. python下载b站视频_【python】抖音无水印视频下载和b站视频下载
  2. Git Commit 提交规范
  3. linux下oracle导出dmp文件,并排除不需要导出的表
  4. Hive中alter table 对分区表的操作:添加列,修改列,删除历史分区
  5. Vue.js引入echarts、elementUI、museUI、mintUI
  6. SPSS20.O---软件安装
  7. C27_OC17-日期类型NSDate
  8. tp框架如何关掉错误提示信息
  9. 关于350D的跑焦问题
  10. 微信 updateAppMessageShareData ios分享不出来标题内容