关于堆排序的一些思考

最近在做个堆排序的时候有点疑惑,疑惑在于对一个乱序数组利用堆排序使之有序。

先了解两个概念:小顶堆(根结点的值小于子结点的值)和大顶堆(根结点的值大于子结点的值)。


n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。

  情形1:k<= k2i 且k<= k2i+1 最小化堆或小顶堆

  情形2:k>= k2i 且k>= k2i+1 (最大化堆大顶堆

  其中i=1,2,…,n/2向下取整;


一开始的时候,或者说是潜意识下认为,如果想要使一个乱序数组利用堆排序使之升序(数组从小到大),就要建立小顶堆;而要使数组变成降序(数组从大到小),就要建立大顶堆。

先给个结论:这个思路完全错误。实质上的结论是:想要使一个乱序数组利用堆排序变成升序数组,需要建立大顶堆;要使一个乱序数组利用堆排序变成降序数组,需要建立小顶堆。


我们需要注意,把乱序数组变成升序数组的时候,是把建立好的堆的堆顶和堆尾元素交换,是把交换后的结点值进行排序。所以当给乱序数组建堆的时候,只有建立最大堆使堆顶元素为整个堆的最大值,然后把堆顶与堆尾交换,堆尾就变成最大值。然后继续第二轮的建立最大堆,得到的堆顶和倒数第二个堆尾交换……依次建立最大堆,交换……最终得到了一个升序的堆,即达到升序。


参考:

堆排序 Heap Sort

(转载)排序六 堆排序


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值