快速排序

  • 简介
  • 排序过程
    • 1.生成完全二叉树
    • 2.构造大顶堆
    • 3.循环删除堆顶元素
  • 时间复杂度
  • 空间复杂度
  • 稳定性

简介

堆排序 heapsort,是指利用堆这种数据结构所设计的一种排序算法。堆是完全二叉树,分为大顶堆和小顶堆。大顶堆的特点是指任何一个父节点的值,都大于等于它左右孩子节点的值。小顶堆的特点是指任何一个父节点的值,都小于等于它左右孩子节点的值。

文章中使用的动画网站地址:
限 pc: 排序算法动画 :http://www.donghuasuanfa.com/sort/heapSortPortal

算法一览表:https://blog.csdn.net/ww753951/article/details/106862328

排序过程

算法分为三步骤。
        一:将数组构造成二叉树
        二:将完全二叉树构造成大顶堆,树中所有父元素都比子元素大。构造大顶堆的步骤。1.首先从右至左,从下至上遍历非叶子节点,比较非叶子节点和俩个子节点的较大值,如果非叶子节点小于叶子节点较大值,则互换位置,保证调整后的非叶子节点大于子节点。2.互换位置后,因为有可能新的叶子节点比叶子节点的叶子节点还小,所以需要重复比较和互换位置的操作。维持大顶堆的结构。
        三:循环删除堆顶元素,移到集合尾部。将最后一个元素移动到堆顶,调节堆产生新的堆顶。新的堆重复比较非叶子节点和叶子节点的步骤。保证堆的特点。

示例以3,4,2,1,6,5为数组进行演示。

演示的动画来源:堆排序算法动画地址 http://www.donghuasuanfa.com/sort/heapSortPortal

1.生成完全二叉树

首先将数组生成完全二叉树,数组3,4,2,1,6,5生成后的二叉树如下图所示。

2.构造大顶堆

1.首先从右至左,从下至上层序遍历非叶子节点,比较非叶子节点和俩个子节点的较大值,如果非叶子节点小于叶子节点较大值,则互换位置,保证调整后的非叶子节点大于子节点。
        2.互换位置后,因为有可能新的叶子节点比叶子节点的叶子节点还小,所以需要重复比较和互换位置的操作。维持大顶堆的结构。
        示例:
        二叉树从右至左,从下至上层序遍历,当前二叉树最右下侧非叶子节点为2,所以首先遍历的节点为2。

        获取节点2的两个叶子节点较大的节点,因为当前2节点只有一个节点5,所以获取的为5。再比较2和5的大小,因为构造的是大顶堆,且叶子节点5大于2。 所以需要互换位置。

继续遍历下一个节点,下一个非叶子节点为4。

        获取节点4的两个叶子节点1和6较大的节点,所以获取的为6。再比较4和6的大小,因为构造的是大顶堆,且叶子节点6大于4。 所以需要互换位置。

继续遍历下一个节点,下一个非叶子节点为3。

        获取节点3的两个叶子节点6和5较大的节点,所以获取的为6。再比较3和6的大小,因为构造的是大顶堆,且叶子节点6大于3。 所以需要互换位置。

        因为交换位置后,交换后的节点不一定比子节点大。所以需要重新处理二叉树。例如示例所示。3节点交换位置后,比子节点要小,所以需要重新处理二叉树,满足大顶堆的特性。3节点找到两个子节点的较大值4。

        因为构造的是大顶堆,且叶子节点4大于3。 所以需要互换位置。最后大顶堆的构造结束。

        整体动图如下所示:

3.循环删除堆顶元素

循环删除堆顶元素,移到集合尾部。将最后一个元素移动到堆顶,调节堆产生新的堆顶。新的堆重复比较非叶子节点和叶子节点的步骤。保证堆的特点。
        堆顶元素为6。末尾元素为2,交换位置后则6元素为已排序元素,如下图所示。

        因为交换位置后,堆顶元素2小于子节点4和5, 所以不满足大顶堆性质。

        需要重复构造大顶堆步骤,交换元素位置,调整二叉树,最终形成大顶堆。

然后重复步骤,再次交换元素位置,则5元素为已排序元素。

        重复上述步骤,直至所有元素排序完成。

-------分割线-------

时间复杂度

最差时间复杂度 平均时间复杂度 最优时间复杂度
O(N∗log2N)O(N*log_{2}N) O(N∗log2​N) O(N∗log2N)O(N*log_{2}N) O(N∗log2​N) O(N∗log2N)O(N*log_{2}N)O(N∗log2​N)

堆排序整体的时间复杂度为:O(N * log2N)。整体主要由构建初始堆+交换堆顶元素和末尾元素并重建堆两部分组成。其中第一部分构建初始堆经推导复杂度为O(n),
        在第二部分交换并重建堆的过程中,需循环数组剩余元素,共交换n-1次,而重建堆的过程中,根据完全二叉树的性质,[log2(n-1),log2(n-2)…1]逐步递减,所以循环剩余数组和每次数组调整堆的过程累计近似为N * log2N。因为第一部分的O(N)基本忽略。所以堆排序时间复杂度一般认为就是O(N * log2N)。

空间复杂度

堆排序只需要元素交换位置即可,无需额外空间, 所以空间复杂度为1。

稳定性

在构建大顶堆时,元素之间的顺序无法保证。所以为不稳定排序。

算法——排序——堆排序图解动画相关推荐

  1. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  2. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

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

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

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

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

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

    排序算法之---堆排序(很重要的一个结构,新手入门必备) 先来简单的介绍一下堆结构: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlo ...

  6. 排序算法:堆排序算法实现及分析

    堆排序介绍 堆排序(Heap Sort)就来利用堆(假设利用大顶堆)进行排序的方法.它的基本思想是,将待排序的序列构成一个大顶堆.此时,整个序列的最大值就是堆顶的根结点.将它移走(其实就是将其与堆数组 ...

  7. C#算法设计排序篇之04-选择排序(附带动画演示程序)

    选择排序(Selection Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/681 访问. 选择排序是一种简 ...

  8. php+堆排序算法,PHP实现排序堆排序(Heap Sort)算法

    算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据 ...

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

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

  10. 十大经典排序算法动图图解

    转载:http://web.jobbole.com/87968/ 0.排序算法说明0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之 ...

最新文章

  1. 混合文件下分离xml文件和jpg文件
  2. 程序运行时堆区和栈区的分配
  3. id vue2路由传参_Vue2.0中 $route 和 $router 的区别
  4. CentOS下安装SecureCRT的sz/rz工具包
  5. Servlet 数据库访问
  6. 苹果或推中国特色版 iPhone;小米回应萌拍抄袭苹果事件;微软停止审核发布 Windows Phone 8.x | 极客头条...
  7. 最简单的视频编码器:基于libvpx(编码YUV为VP8)
  8. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题
  9. git 移除项目版本控制_Git - .gitignore怎么忽略已经被版本控制的文件
  10. 省钱兄(APP、h5版本)任务悬赏点赞平台uniapp前端源码模板
  11. 安装linux出现分区出错,找到了linux分区顺序错乱修复方法
  12. JavaScript--对象类型详解
  13. oracle异步备份,网络存储导论第七章:异步数据复制容灾方式
  14. 一文读懂什么是ICT
  15. Python3.7.0安装报:0x80072efd
  16. 量子卡塔教您如何在Q#中进行量子编程
  17. 电动自行车16 CFR 1512标准要求及流程
  18. 1 errors and 0 warnings potentially fixable with the --fix option
  19. 机器学习-02 基于sklearn 广义线性模型-普通最小二乘法
  20. openFrameworks实现的简单捕鱼游戏

热门文章

  1. matlab基本函数的输入输出,Matlab函数的基本使用
  2. 软件测试-环境搭建思路/测试流程
  3. Turbo码基本框架
  4. 局域网服务器共享文件夹设置,server2012文件夹、局域网共享设置权限以及server2012r2文件共享权限设置方法...
  5. 串口硬盘如何应用于并口硬盘计算机,并口硬盘和串口硬盘的区分与看图学习电脑硬盘的安装...
  6. idea将本地新项目上传至svn
  7. python os模块安装方法_Python模块——os模块详解
  8. limbo镜像linux下载,Limbowin10镜像下载|Limbo模拟器win10镜像 可上网版下载_最火手机站...
  9. MacOS下DockerCE的使用方式
  10. Idea 远程调试服务器