关于堆排序的一点总结

这个排序看了很久都没有理解它的要意所在,定义一个数组A[1….n];

1.       初始化大根堆(小根堆)的目的是什么?

这里书上大概会说是利用大根堆(小根堆)的特性,父节点始终大于叶子结点。所以在建立完大根堆(小根堆)后父节点始终是最大的(小根堆就是最小的),这里的思想和冒泡有点类似。

2.       初始化完了之后怎么做?

后面我才知道这个要反着来,当建立大根堆的时候A[0]是整数组最小的元素(这里指的都是小根堆),这个信息很关键,还有一个信息就是每次调整堆后A[0]都会是整个堆(我一直喜欢说二叉树)的最小元素,所以现在要做的就是移除顶节点再重建堆。这样每次移除的顶节点所组成的序列就是有序的。在这里我一直认为有优化的空间,虽然堆的特性决定了在重建堆的时候可以减少一些交换次数,但是重复比较依然存在。

             在这里我自己陷入一个误区就是在建立小根堆后始终想顺着这些大致排好序的序列进行调整,以达到最终的目的,虽然找到一些规律,但始终没有找到解决办法。

3.       关于时间复杂度

时间分为两部分,第一部分是初始化堆,第二部分就是排序时重建堆,初始化堆的时候n的循环时间代价是O(n),后面重建堆的时候是O(n),而重建堆的时间是O(lgn)(这里的lglog2),也不知道这O(nlgn)是不是这么算出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值