数据结构--堆排序

目录

堆的定义 

建立初始化堆的步骤

建立大根堆的代码

大根堆排序的代码 

算法效率分析 

稳定性


堆的定义 

回忆

基于选择排序的特性:选取关键字最小(或者最大)的元素放入到序列里面,知道了大堆和小堆概念,所以将数组转换为二叉树用大小堆,进行选择排序比较方便

建立初始化堆的步骤

下面讲解给了初始序列(数组形式)如何转换为大根堆的样子来进行选择排序

非终端结点就是i<=n/2,即8/2=4,数组下标是01234的,后面的5678下标都是叶子结点不用管

调整后的样子如下

建立大根堆的代码

得到

 

09小元素下坠如下: (每次把最大的元素往上面放)09的左右子树当中右子树78最大,78上移

09还是小于左右子树,此时左子树65大于53,所以把65上移,09下坠到65的位置 得到如下:

完成了第一趟的处理,效果是把最大元素放到末尾,上面树成为大根堆的形式

第二趟

78和53交换

交换得到如下 78和87已经放到最后就暂时不用考虑了

53进行下坠,和65换位置得到如下: (78放到最后了不需要和53比较)

剩余元素成为了大根堆,如下所圈出来部分

第三趟

 得到

下坠:

 

得到如下,所圈出来部分又是大根堆

依次类推,得到结果

大根堆排序的代码 

算法效率分析 

只需要记住建堆的过程,关键字对比次数不超过4n,建堆的时间复杂度=O(n)

 

稳定性

堆排序不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值