前言:《数据结构》作为计算机专业的一门重点学科,无论是将来考研、就业,对其的考察都是重中之重,之前的文章已经对此进行过论述。作为考察程序员“编程能力”的一种方式,考验的是我们如何将数据结构的思想用编程语言精确的编码出来。所有的《数据结构》课本都详细的讲解了每一种数据结构和算法的思想,然后给出具体的编程语言代码或者伪代码。算法思想只要认真看书,还是比较容易掌握的 ,真正考验我们的,是从算法思想到具体编码的这个思考过程,就是思考如何编码实现,这个过程是逃不掉的,除非参考别人的现有代码,但一段时间过后一定会忘记(百分之百的,我就忘记了无数次了)。所以,尽量在编程实现前,自己有个清晰的思路,尝试着自己去实现.
代码:
本文全部代码放在 github,需要的可以下载或者直接复制代码运行,只有一个cpp文件。已经通过测试,完全没有问题。这里重点是实现算法思想,所以没有考虑代码的健壮性,没有异常处理。
关四点说明
注意:本文我所说的堆,都指大顶堆。
1)堆的特点是父节点的值大于或等于两个孩子节点的值,一个堆就是一个完全二叉树,所以我们采用数组来存储二叉树,会非常方便。因此,整个数组的序列,也就是一颗二叉树的层次遍历结果(从上到下,从左至右),这一点要知道。
2)建堆的过程:就是从最后一个非终端结点开始,比较其与其孩子节点的大小,如果孩子有比他大的,就交换。如果两个都比他大呢?那就与最大的那个交换。
3)几个需要计算的节点:因为我们是从最后一个非终端结点开始开始遍历,所以要知道它在数组中的位置,知道了它的位置,剩下的只需要依次递减,直到第一个,也就是根节点了。此外,我们还需要知道一个节点的左孩子和右孩子的位置。因为堆是完全二叉树,而且采用数组存储,所以计算还是有规律的。
4)堆排序的流程:给定一个数组,然后建堆——>输出堆的根节点(也就是数组的第一个元素)——>将根节点置为0——>重新建堆——>输出堆的根节点——>……………
附上代码
|
|