堆排序(Heapsort)-全网最详细
目录
- 基本思想
- 算法步骤
- 图解算法
- C++程序
基本思想
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。大顶堆的根节点是二叉树中最大的节点,每次操作提取此最大节点,完成排序。
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
算法步骤
- 创建一个堆 H[0……n-1];
- 把堆首(最大值)和堆尾互换;
- 把堆的尺寸缩小 1;
- 重复步骤 2,直到堆的尺寸为 1。
图解算法
我们对如图的数据进行排序,下方的二叉树是层序遍历形成的。
如何把这颗二叉树变成大顶堆?
每个父节点的值都大于或等于其子节点的值
叶子节点已经是一个堆了,不用改变,所以我们从第二层开始进行,35和38需要换位置
之后堆77操作,77符合大顶堆定义,不用改变
之后对48操作,48需要和77换位置
此时,形成大顶堆,根节点是最大的元素,我们取出根节点,对其他数据进行大顶堆排序。
为了节省空间,我们把第一个元素(根节点)和最后一个元素交换位置,这样最后一个元素是排好序的,对前面的数据再次进行大顶堆排序,取出此时的最大元素放到倒数第二个位置…
C++程序
#include <iostream>
#include <algorithm>
using namespace std;void max_heapify(int arr[], int start, int end)
{// 堆顶开始,父节点是堆顶 int dad = start;int son = dad * 2 + 1; //子节点 while (son <= end) { // 若子節點指標在範圍內才做比較if (son + 1 <= end && arr[son] < arr[son + 1]) // 两个子节点选择大的子节点 son++;if (arr[dad] > arr[son]) // 如果父节点大于子节点,代表跳转完毕,退出 return;else { // 否则交换父子节点,再和孙节点比较 swap(arr[dad], arr[son]);dad = son;son = dad * 2 + 1;}}
}void heap_sort(int arr[], int len) {// 初始化,i从最后一个父节点开始调整,//因为叶子节点已经是一个堆了,所以从len/2开始 ,直到根节点0for (int i = len / 2 - 1; i >= 0; i--)max_heapify(arr, i, len - 1);// 第一个元素已经排序好,放到最后面去,然后调整前面的i-1个元素 for (int i = len - 1; i > 0; i--) {swap(arr[0], arr[i]);max_heapify(arr, 0, i - 1);}
}int main() {int arr[] = { 72,62,38,48,55,14,35 };int len = (int) sizeof(arr) / sizeof(*arr);heap_sort(arr, len);for (int i = 0; i < len; i++)cout << arr[i] << ' ';cout << endl;return 0;
}
堆排序(Heapsort)-全网最详细相关推荐
- “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作
"是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...
- 全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案(图文详解)
全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案(图文详解) 参考文章: (1)全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案 ...
- 全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)...
不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 全网最详细的大数据集群 ...
- 全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)
全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解) 参考文章: (1)全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问 ...
- 全网最详细的深度学习pytorch-gpu环境配置
学习深度学习第一步就是环境的配置,相信很多小伙伴已经被什么anaconda,tensorflow,Pytorch,cuda这些东西搞得晕头转向,今天带大家详细配置深度学习的环境,这一篇准要教书Pyto ...
- 全网超详细的VMware虚拟机安装Kali Linux系统以及首次启动Kali Linux系统的注意事项
文章目录 1. 简述Kali Linux 2. 下载Kali Linux的镜像文件 3. 安装Kali Linux 4. 首次启动Kali Linux 5. 其他方法安装Kali Linux 1. 简 ...
- 【 linux 从入门到放弃(全网最详细虚拟机及c7安装)】
linux 从入门到放弃(全网最详细虚拟机及c7安装) 文章目录 linux 从入门到放弃(全网最详细虚拟机及c7安装) 一.初识linux 二.linux 发展 二.linux 组成 三.linux ...
- 玩机搞机---全网最详细的手机全机型 刷机教程 二
接上篇 玩机搞机---全网最详细的手机全机型 刷机教程一 玩机搞机---mtk芯片机型线刷救砖的一些基本解决方法和步骤解析 mtk报错代码 SP_Flash平台刷机 超详细的三星全系列机型线刷图文教程 ...
- 全网最详细的Neo4j安装教程
全网最详细的Neo4j安装教程 一.前言 Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是 ...
- 最新阿里大于短信配置接口-2020全网最详细版-划水小老虎
最新阿里大于短信配置接口-全网最详细版 一,登录阿里云,做对接前准备 1,配置签名 2,配置模板 3,配置acessKey 二,下载阿里大于的SDK 三,发送短信 1,解压文件,放入TP5框架中 2, ...
最新文章
- xshell如何登陆数据库_Xshell连接远程服务器和操作数据库
- 全球及中国垃圾发电行业运营管理及十四五投资价值评估报告2021-2027年
- gsmake —— golang版gradle
- 微信小程序 子组件调用父组件方法
- win2003的IIS無法使用,又一次安裝提示找不到iisadmin.mfl文件
- SQL validation failed.Column ‘content‘ not found in any table
- .NET6之MiniAPI(十二):引入EntityFramewor
- 《Python Cookbook 3rd》笔记(4.13):创建数据处理管道
- wireshark windows版数据过滤插件安装及使用
- python 入门基础-Python入门基础
- jquery视频教程(jquery视频教程全集)
- HD TUNE 下载使用
- 加减乘除求余 利用 位运算实现(详细)
- view函数--python
- 江苏各大高校开学具体时间,快来看看有你的学校吗?小伙伴们想开学了吗?
- [javascript]Ex站阅读器
- 【免费培训】腾讯WeTestTesterHome WorkShop | 一起学压测
- LightDM详细介绍
- 【转载】使用Pandas创建数据透视表
- 计算机组成原理-第三章-存储系统