数据结构 —— 堆排序
来源:互联网 发布:傲剑神照升级数据大全 编辑:程序博客网 时间:2024/05/24 01:45
一般用数组来表示堆,若根结点存在序号0处, i结点的父结点下标就为(i-1)/2。i结点的左右子结点下标分别为2*i+1和2*i+2。
(注:如果根结点是从1开始,则左右孩子结点分别是2i和2i+1。)
堆:堆是完全树;
分为大顶堆和小顶堆;大顶堆要求每一个父节点的值大于子节点的值,并且所有子树都是大顶堆(结果是根节点是最大的数)
小顶堆要求每一个父节点的值小于子节点的值,并且所有子树都是小顶堆(结果是根节点是最小的数)
堆排序: 若在输出堆顶的元素后,使得剩余的n-1个元素的序列重又建成一个堆,则得到的n个元素中的次小值。如此反复执行,便能得到一个有序序列,这个过程称为堆排序。
因此实现堆排序要解决两个问题,1:如何使一个无序序列建成一个堆?
2:如何在输出堆顶元素之后,调整剩余元素成为一个新的堆?
即无论如何,别忘了最终目的是将一个无序序列转换为一个有序序列,即最后目的不是要得到一个堆,而是一个有序序列,堆只是一个过程,所以一个堆取一个根元素,然后与最后一个元素互换位置,这时堆的结构被破坏,需要重新建立堆,然后再取得一个根元素,这样重复,到最后得到一个有序序列。
我们称自堆顶叶子的调整过程为筛选。(筛选不涉及最后一个元素和根元素的互换,只涉及互换之后的建堆过程):即一个完全树除了根元素以外他的左右子树都是堆,假设建立一个大顶堆:首先将根元素与左右子树根节点值比较,将比根元素大的节点的值与根元素的值互换,假设是左子树,这时,左子树由于根节点值改变,破坏了左子树的堆,需进行和上述相同的操作(此步不进行根节点和最后一个节点互换操作),直到产生一个新的堆,这时再将根节点输出,将最后一个节点换到根节点,在进行上述操作,直到所有元素均被输出。
(注:如果根结点是从1开始,则左右孩子结点分别是2i和2i+1。)
堆:堆是完全树;
分为大顶堆和小顶堆;大顶堆要求每一个父节点的值大于子节点的值,并且所有子树都是大顶堆(结果是根节点是最大的数)
小顶堆要求每一个父节点的值小于子节点的值,并且所有子树都是小顶堆(结果是根节点是最小的数)
堆排序: 若在输出堆顶的元素后,使得剩余的n-1个元素的序列重又建成一个堆,则得到的n个元素中的次小值。如此反复执行,便能得到一个有序序列,这个过程称为堆排序。
因此实现堆排序要解决两个问题,1:如何使一个无序序列建成一个堆?
2:如何在输出堆顶元素之后,调整剩余元素成为一个新的堆?
即无论如何,别忘了最终目的是将一个无序序列转换为一个有序序列,即最后目的不是要得到一个堆,而是一个有序序列,堆只是一个过程,所以一个堆取一个根元素,然后与最后一个元素互换位置,这时堆的结构被破坏,需要重新建立堆,然后再取得一个根元素,这样重复,到最后得到一个有序序列。
我们称自堆顶叶子的调整过程为筛选。(筛选不涉及最后一个元素和根元素的互换,只涉及互换之后的建堆过程):即一个完全树除了根元素以外他的左右子树都是堆,假设建立一个大顶堆:首先将根元素与左右子树根节点值比较,将比根元素大的节点的值与根元素的值互换,假设是左子树,这时,左子树由于根节点值改变,破坏了左子树的堆,需进行和上述相同的操作(此步不进行根节点和最后一个节点互换操作),直到产生一个新的堆,这时再将根节点输出,将最后一个节点换到根节点,在进行上述操作,直到所有元素均被输出。
阅读全文
0 0
- 数据结构 — 堆排序
- 数据结构——堆排序
- 数据结构——堆排序
- 数据结构——堆排序
- 数据结构——堆排序
- 数据结构 —— 堆排序
- 数据结构 — 浅析堆排序
- 数据结构之排序——堆排序
- 数据结构排序算法——堆排序
- 数据结构与算法——堆排序
- 数据结构学习11——堆排序
- 数据结构示例——堆排序过程
- 数据结构与算法——堆排序
- Java数据结构——堆排序实现
- 数据结构之——堆排序
- 数据结构&算法实践—【排序|选择排序】堆排序
- 复习数据结构:排序算法(六)——堆排序
- 数据结构例程——选择排序之堆排序
- ActiveMQ简单介绍以及安装
- POJ 3617 字典序最小
- Maven学习入门
- 机器视觉资料
- 如何在XCode上禁用indexing
- 数据结构 —— 堆排序
- Remark Holdings的全球化布局:用人工智能深耕每一个细分领域
- Children’s Queue (大数/高精度)
- [喵咪大数据]初识大数据
- 线程死锁
- 欧拉筛法求素数(模板)
- 批处理 回显屏蔽
- linux TUN/TAP虚拟网卡
- MySQL日期和时间的查询