堆排序

思想:

堆排序本质上也是一种选择排序。选择排序是以“重复选择”为思想的。

堆排序算法需要一个辅助算法——堆调整算法。该算法保证元素构成一个堆。

在非降序排序中,使用的是大顶堆(根节点具有最大元素)。首先重新安排序列,使之形成一个大顶堆,然后反复撤销根元素(该步骤即是选择最大元素),并把它送到适当的位置上。

 

伪代码:

而堆排序的所有操作可以看做以下两部分:

生成大顶堆

For:in2

         把根节点放入H[i]      //从小到大排序,选择第i个元素放在合适的位置上

         调整堆

 

生成大顶堆的过程

首先要知道两点:

1、  在一个完全二叉树中,叶子节点数=(总结点数+1)/2

2、  任意一个元素都构成一个堆。

具体的生成过程可以有两种选择方式:

1、  H[1]构成了一个大顶堆;然后i2n开始,调整H[1,…,i]为大顶堆。

此处用到的堆调整是siftUp,伪代码如下:

Fori2n

                   SiftUp(H,i)

2、  所有的叶子节点都构成各自的堆(即,H[(n+1)/2],H[(n+1)/2+1]….H[n]都构成各自的大顶堆)。然后,in/21,调整H[i,…,n]为大顶堆。

此处用到的堆调整是siftDown,伪代码如下:

For in/21

                   siftDown (i)

 

算法分析:

T(n)=O(nlgn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值