从堆排序的简介到堆排序的算法实现等如下:

1. 简介
堆排序是建立在堆这种数据结构基础上的选择排序,是原址排序,时间复杂度O(nlogn),堆排序并不是一种稳定的排序方式。堆排序中通常使用的堆为最大堆。
2. 堆的定义
堆是一种数据结构,是一颗特殊的完全二叉树,通常分为最大堆和最小堆。最大堆的定义为根结点最大,且根结点左右子树都是最大堆;同样,最小堆的定义为根结点最小,且根结点左右子树均为最小堆。
最大堆满足其每一个父结点均大于其左右子结点,最小堆则满足其每一个父结点均小于其左右子结点。
3. 堆排序
3.1 堆的存放
在堆排序中,堆所表示的二叉树并不需要使用指针的方式在计算机中存放,只需要使用数组即可,将树的结点,从上至下,从左至右一个个放到数组中去。
因此,如果数组的起始索引为0,对于一个结点i来说,它的父结点索引为⌊i/2⌋,它的左子结点索引为2i+1,右子结点索引为2i+2。最后一个非叶子节点就是最后一个结点的父亲,如果数组长度为n,那么其索引为⌊(n-1)/2⌋。
3.2 堆排序主要步骤
将无序序列构建成最大堆
将数组分成两个区域,有序区和无序区,初始时创建一个整数i为数组的长度,用来划分有序区和无序区,有序区初始为空。
将堆顶元素和最后一个无序区的元素交换,然后i-1。
调整使得所有无序区的元素重新为最大堆。
重复3,4步,直到 i = 0
3.3 堆的调整
假设有某棵完全二叉树,其左右子树均为最大堆,如何调整使得该二叉树成为最大堆呢?如果根结点大于左右子结点,那么已经是最大堆了,无需调整。否则,交换根结点和左右子结点中较大的那个。假设交换的是左结点,那么目前这棵完全二叉树右子树仍然是一个最大堆,左子树则不一定,但是左子树的左右子树还是最大堆,因此不断递归下去调整即可。
因此,交换最后一个元素和堆顶元素后的调整步骤,就和上面所说的一致。而将无序序列构建成最大堆,同样也可以运用这一点。从最后一个非叶子结点到第一个非叶子结点(根结点),对这些结点作为根结点的子树,按顺序调用一次上述描述的调整即可(每次调用时,该子树的左右子树必定是最大堆)。
4. 算法实现
#include <stdio.h>
void swap(int *a,int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
//左右子树都是最大堆,从上至下调整使得最大堆, root_index是要调整的树的根节点,length是无序区的长度
void adjust(int array[],int root_index,int length) {
int left_child = root_index*2+1;
int right_child = left_child+1;
int left_or_right = 0;
if((left_child >= length && right_child >= length) || (left_child >= length && array[root_index] >= array[right_child]) ||
(right_child >= length && array[root_index] >= array[left_child]) || (array[root_index] >= array[left_child] && array[root_index] >= array[right_child])){
return;
}
else if (array[left_child] >= array[root_index] && (right_child >= length || array[left_child] >= array[right_child])) {
left_or_right = 1;
}
else if (array[right_child] >= array[root_index] && (left_child >= length || array[right_child] >= array[left_child])) {
left_or_right = 0;
}
if(left_or_right) {
swap(&array[left_child],&array[root_index]);
adjust(array,left_child,length);
}
else {
swap(&array[right_child],&array[root_index]);
adjust(array,right_child,length);
}
}
//heapsort主递归,每一次将无序区最后一个元素与堆顶元素交换,将堆顶元素加入有序区,因此有序区加1,无序区减1,无序区只剩一个元素的时候递归终止
void heapsort_main(int array[],int length,int last_index) {
int i;
if(last_index == 0)
return;
swap(&array[0],&array[last_index]);
adjust(array,0,last_index);
heapsort_main(array,length,last_index-1);
}
//入口函数,array是待排序的数组,length是其长度
void heapsort(int array[],int length) {
int i;
for(i = length/2-1;i >= 0;i--) {
adjust(array,i,length);
}
heapsort_main(array,length,length-1);
}
int main(int argc,char *argv[]) {
int array[9] = {1,1,1,2,3,5,2,3,5};
heapsort(array,9);
int i;
for(i = 0;i < 9;i++) {
printf("%d ",array[i]);
}
}
5.堆排序性质
时间复杂度O(nlogn)
空间复杂度O(1)
不稳定排序
本篇文章对堆排序所整理的内容,希望可以帮到需要的朋友
# java堆排序原理及算法实现
# java堆排序
# Java 十大排序算法之堆排序刨析
# JAVA堆排序算法的讲解
# Java实现堆排序(大根堆)的示例代码
# java堆排序原理与实现方法分析
# java堆排序概念原理介绍
# java 数据结构之堆排序(HeapSort)详解及实例
# 深入解析堆排序的算法思想及Java代码的实现演示
# java实现堆排序以及时间复杂度的分析
# 子树
# 大堆
# 递归
# 二叉树
# 都是
# 均为
# 数据结构
# 于其
# 上至
# 的是
# 是一个
# 是一种
# 基础上
# 一颗
# 只需要
# 中去
# 不稳定
# 只剩
# 创建一个
# 到第
相关文章:
代购小票制作网站有哪些,购物小票的简要说明?
如何通过主机屋免费建站教程十分钟搭建网站?
建站之星CMS五站合一模板配置与SEO优化指南
用v-html解决Vue.js渲染中html标签不被解析的问题
内网网站制作软件,内网的网站如何发布到外网?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
Swift开发中switch语句值绑定模式
如何登录建站主机?访问步骤全解析
如何解决ASP生成WAP建站中文乱码问题?
TestNG的testng.xml配置文件怎么写
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何制作算命网站,怎么注册算命网站?
如何注册花生壳免费域名并搭建个人网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何快速搭建高效香港服务器网站?
高端建站如何打造兼具美学与转化的品牌官网?
如何在新浪SAE免费搭建个人博客?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何高效完成自助建站业务培训?
建站主机服务器选型指南与性能优化方案解析
建站之星如何快速更换网站模板?
建站之星下载版如何获取与安装?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何零基础在云服务器搭建WordPress站点?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何在服务器上配置二级域名建站?
高端网站建设与定制开发一站式解决方案 中企动力
网站制作新手教程,新手建设一个网站需要注意些什么?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
定制建站如何定义?其核心优势是什么?
如何在阿里云部署织梦网站?
红河网站制作公司,红河事业单位身份证如何上传?
如何用PHP快速搭建CMS系统?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何快速建站并高效导出源代码?
如何快速查询网址的建站时间与历史轨迹?
h5网站制作工具有哪些,h5页面制作工具有哪些?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何在局域网内绑定自建网站域名?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何在腾讯云服务器上快速搭建个人网站?
宝塔新建站点为何无法访问?如何排查?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何打造高效商业网站?建站目的决定转化率
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
香港服务器选型指南:免备案配置与高效建站方案解析
专业商城网站制作公司有哪些,pi商城官网是哪个?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
*请认真填写需求信息,我们会在24小时内与您取得联系。