排序算法之---堆排序(很重要的一个结构,新手入门必备)

先来简单的介绍一下堆结构:

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它是不稳定排序。首先简单了解下堆结构。

 堆是具有以下性质的完全二叉树:

每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;

每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

如下图:

大根堆和小根堆在数组中的特点如下:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]  (i是指父节点,2i+1是子节点)

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

下面就来介绍一下堆排序的基本思想和步骤:

堆排序的基本思想是:将待排序的序列构造成一个大顶堆(1),此时,整个序列最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆(2),这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了(3)

(1)将待排序的序列构造成一个大根堆:

将数组一个一个插入大根堆中:当插入的元素比起父节点大的时候,与父节点交换,并且将父节点的索引赋值给子节点,不断地 往上递归上去比较。

举个粟子:

当插入9的时候,比较完发现9还比交换后的父节点大,那就还要继续交换了。

(2)构成大根堆之后,此时整个序列最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆。

54~58这几行表示的是:这个时候就要将较大的子节点与父节点进行比较了,如果子节点更大的话,那就交换父节点和子节点

59~60行这里则表示,当子节点比其父节点还大的时候,交换它们两个的位置,同时,将index指针往下传,继续判断是否有比父节点还大的子节点。

参考:https://www.cnblogs.com/chengxiao/p/6129630.html,这篇博文写的很清晰,只是不同的是,大根堆的形成不是很相同。可以参考,很详细。

排序算法之---堆排序(很重要的一个结构,新手入门必备)相关推荐

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

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

  2. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  3. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  4. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  5. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  6. 排序算法(6)堆排序

    排序算法(6)堆排序---选择排序的高级版 思想:利用数据结构堆的思想来排序,堆排序利用了大堆(或小堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单 ...

  7. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

  8. 常用排序算法之——堆排序

    堆与堆排序的原理,参考该博客: 白话经典算法系列之七 堆与堆排序 二叉堆是个完全二叉树,可以用一个数组来保存节点,不会浪费空间,能快速定位:本人用一个vector来代替数组,省去自己对内存的分配/重分 ...

  9. C/C++排序算法(6)堆排序

    常见排序算法总结(6)堆排序 一篇文章,带你搞懂 堆排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! 堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是 ...

最新文章

  1. 10个角度分析软件工程师应该知道的100件事
  2. 白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联
  3. 内存溢出与内存泄漏区别
  4. 开学前要多为孩子健康做准备
  5. C#实现UTC时间与Datetime转换
  6. php yii多表查询
  7. python将文件数据转换成二维列表
  8. python编码规范简单总结
  9. 5-2 面向可维护性的设计模式
  10. 【数据结构】线性处理字符串中指定字串的个数问题
  11. 【echarts柱状图最大高度】echarts柱状图限制柱子最大高度方法
  12. echarts饼状图设置位置
  13. 用arduinoUNO做温度计
  14. Elasticsearch启动问题:max number of threads [XXX] for user [XX] is too low, increase to at least [4096]
  15. 叮~你的假期余额不足,这份“收心指南”请收好!
  16. 氟胶耐腐蚀油罐泵出口应用性能
  17. Android App拉起另一个App
  18. SpringBoot+Vue实现前后端分离教学评价系统
  19. 自动化篇 - 为闲鱼制作一个客服机器人
  20. 计算机科学导论第五版第二章答案,计算机科学导论样题1答案

热门文章

  1. C语言小白适合入门的项目——扫雷
  2. Navicat for MySQL工具创建mysql数据库定时器
  3. future promise shared_future简单使用
  4. 矩阵连乘 动态规划 详解
  5. pythonweb框架_浅谈python web三大框架
  6. C++PrimerPlus学习——第十四章编程练习
  7. vue修改计算属性的值_「Vue学习记录五」计算属性和侦听器
  8. linux变量最大长度,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  9. Win11系统点击回滚没有反应是怎么回事
  10. 技术员联盟win11系统64位专业版镜像v2021.08