堆排序

来源:互联网 发布:淘宝攒机店铺推荐 编辑:程序博客网 时间:2024/05/09 18:48

    堆排序是一种很巧妙的排序方法,其原理是把数组当做一颗完全二叉树,位置为0的元素为树的根,位置为n的元素,其左子节点的位置为2n+1,右子节点的位置为2n+2。

    堆按照数据的排列顺序分为最大堆和最小堆,堆的性质为:最大堆的每个节点的值都不小于左右子节点的值,因此位置为0的元素为数值最大的元素,最小堆相反。

    堆排序的核心操作在于维护堆的上述性质,该操作称为heapify,既对任何节点n,检查其是否满足上述性质,若不满足,在该节点与两个子节点中找到最大元素m,与节点n交换,交换后,对于m节点继续进行heapify操作,直到遍历到叶节点。对于一个任意的数组,视其为完全二叉树,从下至上对所有内部节点进行heapify操作,堆便建立起来了。

    若要对某数组使用堆排序,首先要建立堆,按照升序排列便建立最大堆,按照降序排列便建立最小堆,建好堆后,将0位置的元素与数组最后一个元素进行交换,此时数组最后一个元素为最大元素,然后对位置为0的元素进行heapify操作,可保证前面所有元素组成的数组仍为最大/最小堆,循环以上操作,数组就可以排序好。

    堆还可以用作优先级队列。关于堆,《算法导论》中有详细的论述。

 

    以下为示例代码,建立一个动态数组,随机填充数据,然后进行堆排序,最后进行验证。

    代码仅供参考,某些分支未进行内存释放,请无视。

    main函数代码如下

    堆排序的时间复杂度为O(nlgn),由此程序可以进行观察。空间复杂度与树的高度成正比。