堆排序
来源:互联网 发布:淘宝攒机店铺推荐 编辑:程序博客网 时间: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),由此程序可以进行观察。空间复杂度与树的高度成正比。
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 谢谢哥们,我终于可以下载软件了
- 中国钟的概念
- 文件上传
- 20101215
- Spring面试
- 堆排序
- flash里onload和onenterframe有什么区别
- 开公司的心得,找房子
- [职场金律]凭什么给你加薪?解决问题才是硬道理
- How do I... Identify and delete duplicates from SQL Server tables?
- android第一个项目--hello world
- C语言基础
- JW测试开发之角色互换
- 搜索引擎Autonomy