博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构排序算法之堆排序
阅读量:5925 次
发布时间:2019-06-19

本文共 1028 字,大约阅读时间需要 3 分钟。

关于堆排序的相关知识非常复杂,不懂得可以参考任意一本数据结构教程,本博客只对堆排序框架及代码进行讲解。

堆排序分三个大的步骤:建初堆,堆调整,堆排序(其中最核心的是堆调整)

1建初堆:从数组中的最后一个非叶子节点开始,从下而上倒推(重复调用堆调整函数)
2堆调整:堆调整的前提是已建好了一个堆,但是因为输出,导致需要重新调整堆,首先获得根节点的子节点中的较大的一个节点,然后将其与根节点进行比较看是否需要调整

如果不需要则可以直接结束此次的堆调整函数,因为堆调整的前提是已建好了一个堆,但是因为交换堆顶元素与堆尾元素,导致需要重新调整堆,因此如果某个节点不需要调整,则其子孙节点都不需要调整。

注意:贱初堆是自底向上的过程,而堆调整是自顶向下的过程。

3堆排序:从数组中所有元素开始,将堆顶元素与堆尾元素交换,然后数组的元素个数减一,然后继续调用堆调整函数。

基于以上框架,堆排序的代码如下:

#include
using namespace std;void sift(int a[],int root,int len)//堆调整函数{ int child=2*root; while(child<=len)//注意该函数的参数是从root到len,所以此处必须写= { if(child
=1;i--)//从最后一个非叶子结点开始,自底向上倒推,之所以是从非叶子结点开始。是因为该函数是将当前结点与其子结点比较大小,而叶子结点无子结点 { sift(a,i,n);//调整堆函数的参数为,array_name,root,len. }}void heap_sort(int a[],int n){ cre_heap(a,n);//堆排序的第一步,建初堆 for(int i=n;i>=1;i--) { swap(a[1],a[i]); sift(a,1,i-1); }}void main(){ int a[10]={0,4,2,1,3,7,6,5,9,8}; heap_sort(a,9); for(int i=0;i<10;i++) { cout<
<<' '; } cout<
程序运行结果如下:



转载于:https://www.cnblogs.com/hainange/p/6334080.html

你可能感兴趣的文章
JavaMail实现收发邮件(五)使用SSL实现加密传输
查看>>
RedHat Linux 企业5 oracle 10g
查看>>
kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记
查看>>
JPA:detached entity passed to persist
查看>>
RedHat Enterprise Linux 7下安装 Oracle 12C
查看>>
富士施乐c1110B检测软件SM
查看>>
Office365 分配管理员角色
查看>>
博文批量发布工具使用说明
查看>>
Active Directory还原工具之四ADRecycleBIN
查看>>
一起学Shell之(二)输出以及其它
查看>>
Windows Server 2008 R2 之十九Bcdedit的使用
查看>>
[转] SqlServe到PG迁移错误:无效的编码序列"UTF8": 0x00
查看>>
Nginx + nagios +perl fcgi 取缔apache
查看>>
Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
查看>>
《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用
查看>>
脚本监控网络状态,输出日志并归档(V2)
查看>>
轻量级HTTP服务器Nginx(Nginx日常维护)
查看>>
Android系统的开机画面显示过程分析(1)
查看>>
7.VMware vsphere 5.0新体验-备份
查看>>
组建高效快速研发团队的必要角色
查看>>