关于html:第-27-题如何理解堆排序

38次阅读

共计 1382 个字符,预计需要花费 4 分钟才能阅读完成。

什么是堆排序?

是指利用堆这种数据结构所设计的一种排序算法。沉积是一个近似齐全二叉树的构造,并同时满足沉积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点

在看本文之前请先理解以下概念

齐全二叉树:除了最初一层之外的其余每一层都被齐全填充,每一层从左到右的填充数据,不能空缺(只是相似这个构造,所以本文不会用到这个知识点)

堆:分为大顶堆和小顶堆两种

大顶堆(小顶堆):可分为有序区和无序区,初始全副为无序区

执行的步骤是如何进行的?

  1. 无非就是将一个无序数组转化为大顶堆(小顶堆)
  2. 将堆顶的值和无序数组开端值替换地位
  3. 依据堆的性质进行调整,成为大顶堆(小顶堆)
  4. 而后又持续 1~3 的步骤,反反复复直到无序区没有值为止

这个时候必定会有人问,怎么区别有序区和无序区?什么是大顶堆(小顶堆)?以及大顶堆(小顶堆)是如何调整进去的?

如何分别有序区和无序区?

<img src=”https://noxussj.top:3000/27/1.png”></img>

<img src=”https://noxussj.top:3000/27/2.png”></img>

循环完结后应该是这样的,没有无序区了

<img src=”https://noxussj.top:3000/27/3.png”></img>

下面的大顶堆(小顶堆)理论在存储在数组中是这样的

当初应该晓得有序区和无序区如何分辨了吧,以及大顶堆是如何在数组中进行存储的

什么是大顶堆(小顶堆)?

<img src=”https://noxussj.top:3000/27/4.png”></img>

通过上图应该都能看进去大顶堆和小顶堆的区别了吧。

大顶堆:每个结点的值都大于或等于其左右孩子结点的值(大到小排列)

小顶堆:每个结点的值都小于或等于其左右孩子结点的值(小到大排列)

大顶堆(小顶堆)是如何调整进去的?

也是本文中最难了解的中央,上面简略形容一下次要的步骤:

指标:将无序数组 (R1,R2….Rn) 构建成大顶堆,即实现工作

  1. 初始时,此堆的所有值都是属于无序区
  2. 将堆顶元素 R[1]与无序区中最初一个元素 R[n]替换,此时失去新的无序区 (R1,R2,……Rn-1) 和新的有序区(Rn)
  3. 因为替换后新的堆顶 R[1]可能违反堆的性质,因而须要对以后无序区 (R1,R2,……Rn-1) 调整为新堆
  4. 而后再次将 R[1]与无序区最初一个元素替换,失去新的无序区 (R1,R2….Rn-2) 和新的有序区(Rn-1,Rn)。一直反复此过程直到无序区的元素个数 0,则整个排序过程实现

总结

  1. 其实次要的操作就是结构初始堆和调整堆。
  2. 每次调整都是从父节点(i – 1)/ 2、左孩子节点(2 i + 1)、右孩子节点(2 i + 2)三者中抉择最大者跟父节点进行替换地位

<img src=”https://noxussj.top:3000/27/5.gif”></img>

堆排序过程

参考资料
神级根底排序——堆排序
值得珍藏的十大经典排序算法
漫画:什么是堆排序?
堆排序(大根堆)

附加

  • 此文章通过自媒体多平台公布,公布后不再进行保护,如对内容有任何异议能够到下方的 GitHub 中进行探讨
  • 【继续保护 / 更新 500+ 前端面试题 / 笔记】https://github.com/noxussj/In…
  • 【利用 THREE.JS 实现 3D 城市建模(珠海市)】https://3d.noxussj.top/
正文完
 0