现在的位置: 首页 > 综合 > 正文

堆排序完整代码带详解

2013年09月15日 ⁄ 综合 ⁄ 共 2252字 ⁄ 字号 评论关闭

1:今天看了堆排序总觉得似懂非懂的,下午自习了解了一下已经独立完成C代码的堆排序,我先描述一下然后放出代码,最终会放出来和数据结构课本上完全一致的代码。

2:堆排序时利用堆得性质,也就是二叉树的根节点要么小于两个子节点,那么大于2个子节点。堆排序中是首先建立的根节点大于子节点的堆,也就是说的大堆。

3:建立好大堆之后,root点的元素最大,于是把root和最后一个元素调换位置,接着再对前n-1个元素构建成为一个大堆,接着继续把root点和n-1点对换,接着,。。。。一直到只剩下一个节点的时候就不用再构建大堆了,就可以了。

 

因为root和最后一个节点兑换之后,此时之后根节点所在的树不一定完全符合堆得概念,所以首先调整第一棵树,保证头结点比两个孩子结点都大,条换完后可能子树出现不符合的,然后再调换,知道调换到符合或者该节点跑到了叶子上为止。

所以这个过程一共2个方法,一个事构建堆,一个事兑换完之后对剩下的再构建堆。

 

这2个都是构建堆,但是初始化的构建堆是从i = n/2的节点一致到i=1的节点构建的,而剩下的再构建堆是从i=1开始构建的,所以不是完全的相同,但是也可以到最后弄成一个函数,书上就是这么写的(其实觉得书上应该写的越是容易理解猜对,而发现书上总是故意绕圈子写的很简洁以至于很多地方难懂了)。根据这个思路我先弄上去代码。

 

 

这个代码保证正确,我本地已经写出来测试过的了。

 

 

抱歉!评论已关闭.