十大经典排序算法-堆排序算法详解
十大经典排序算法
- 十大经典排序算法-冒泡排序算法详解
- 十大经典排序算法-选择排序算法详解
- 十大经典排序算法-插入排序算法详解
- 十大经典排序算法-希尔排序算法详解
- 十大经典排序算法-快速排序算法详解
- 十大经典排序算法-归并排序算法详解
- 十大经典排序算法-堆排序算法详解
- 十大经典排序算法-计数排序算法详解
- 十大经典排序算法-桶排序算法详解
- 十大经典排序算法-基数排序算法详解
一、什么是堆排序
1.概念
堆排序(Heapsort)是利用二叉堆的概念来排序的选择排序算法,分为两种:
- 升序排序:利用最大堆进行排序
- 降序排序:利用最小堆进行排序
2.算法原理
给定一个最大堆如下图所示,以该最大堆进行演示堆排序
首先,删除堆顶元素10(即最大的元素),并将最后的元素3补充到堆顶,删除的元素10,放置于原来最后的元素3的位置
根据二叉堆的自我调整,第二大的元素9会成为二叉堆新的堆顶
删除元素9,元素8成为最大堆堆顶
删除元素8,元素7成为最大堆堆顶
依次删除最大元素,直至所有元素全部删除
此时,被删除的元素组成了一个从小到大排序的序列
3.算法实现
// 下沉调整
// 最大堆
function downAdjust(arr, parentIndex, length) {// 缓存父节点的值,用于最后进行赋值,而不需要每一步进行交换let temp = arr[parentIndex];// 孩子节点下标,暂时定为左孩子节点下标let childIndex = 2 * parentIndex + 1;while (childIndex < length) {// 当存在右孩子节点,且右孩子节点的值小于左孩子节点的值,childIndex记录为右孩子节点的下标// childIndex实际记录的是最小的孩子节点的下标if (childIndex + 1 < length && arr[childIndex + 1] > arr[childIndex]) {childIndex++;}// 如果父节点的值比孩子节点的值都小,则调整结束if (temp >= arr[childIndex]) {break;}// 将最小的孩子节点的值赋值给父节点arr[parentIndex] = arr[childIndex];parentIndex = childIndex;childIndex = 2 * parentIndex + 1;}arr[parentIndex] = temp;
}// 堆排序
function sort(arr) {// 把无序数组构建成二叉堆for (let i = parseInt(arr.length / 2) - 1; i >= 0; i--) {downAdjust(arr, i, arr.length);}console.log(arr);// 循环删除堆顶元素,移到集合尾部,调节堆产生新的堆顶for (let i = arr.length - 1; i > 0; i--) {// 最后一个元素与第一个元素交换[arr[0], arr[i]] = [arr[i], arr[0]];downAdjust(arr, 0, i);}
}let arr = [10, 9, 8, 5, 6, 7, 1, 4, 2, 3];
sort(arr);
console.log(arr);
三、堆排序算法特点
1.时间复杂度
下沉调整的时间复杂度等同于堆的高度O(logn),构建二叉堆执行下沉调整次数是n/2,循环删除进行下沉调整次数是n-1,时间复杂度约为O(nlogn)
2.空间复杂度
堆排序算法排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)
3.稳定性
堆排序算法在排序过程中,相同元素的前后顺序有可能发生改变,所以堆排序是一种不稳定排序算法
另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细
https://tinyutil.com/
还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处
十大经典排序算法-堆排序算法详解相关推荐
- 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序
养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法详解
本文转自 <卢明冬的博客> 文章目录 排序算法的分析和评价 2.十大排序经典算法总览 2.1 排序算法的分类 2.2 排序算法的性能 2.3 各阶复杂度性能对比 2.4 排序算法的初始状态 ...
- 十大经典排序算法-希尔排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-归并排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-冒泡排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...
- 【GIF动画+完整可运行源代码】C++实现 堆排序——十大经典排序算法之七
十大经典排序算法系列博客-->传送门 堆排序Heapsort是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大 ...
最新文章
- 雅虎中国弃门户回归搜索 推出新搜索产品线
- ROS中RVIS导入机器人模型,添加摄像头,雷达,Kinect
- 设计模式--中介者(Mediator)模式
- 信息系统项目管理师-第5章:项目范围管理-重点汇总
- 使用POI技术简单的将数据库中的数据读取出为Excel文件
- android中几种定位方式详解
- js获取字符串最后一个字符代码
- java参数注解pam_吃透Java基础十:注解
- Xshell连接Ubuntu时提示SSH服务器拒绝了密码
- vscode 语法检查_Jenkins 声明式流水线的语法错误检查
- 苹果或已放弃3月发布廉价新iPhone;贾跃亭回应家人巨额索赔;微软不再继续开发 Visual Basic | 极客头条...
- sqlite工作记录-1数据库数据写入-转
- java jdbc 占位符_java-jdbc
- 纵向合并gridview单元格的两种方法
- HP服务器raid卡型号b110i安装2008R2认不到硬盘缺少硬盘驱动
- 2018 CSDN博客之星评选,请投我一票~
- 最快的进制转换法之一,8421
- 类ChatGPT的部署与微调(上):从LLaMA、Alpaca/Vicuna/BELLE、中文版
- cpu、内存、磁盘、操作系统的关系
- css3的@media