堆排序

堆排序算法利用的结构来执行快速排序。

为了实现从最低到最高排序,堆排序首先将未排序的数组转换为最大堆,以便数组中的第一个元素最大。

假设要排序的数组是:

[ 5, 13, 2, 25, 7, 17, 20, 8, 4 ]

首先将其转换为最大堆,如下所示:



此时堆的内部数组为:

[ 25, 13, 20, 8, 7, 17, 2, 5, 4 ]

现在开始对堆进行排序操作

  1. 将第一个元素索引0与n-1索引进行调换
[ 4, 13, 20, 8, 7, 17, 2, 5, 25 ]
  *                          *
  1. 现在,新的根节点4将会小于其子节点,所以要使用shift down或heapify过程,将最大堆固定为n-2。修复堆后,现在的根是数组中第二大的元素:
[20, 13, 17, 8, 7, 4, 2, 5 | 25]
  1. 将第一个元素与n-2索引处的元素进行调换
[5, 13, 17, 8, 7, 4, 2, 20 | 25]
 *                      *
  1. 继续修复堆并使最大堆固定位n-3
[17, 13, 5, 8, 7, 4, 2 | 20, 25]
  1. 重复此过程,知道整个数组完成排序
    ...

堆排序与选择排序非常相似,选择排序会在数组其余部分反复查找最小值。对于堆排序来说,提取最小值或者最大值是最擅长的。

总结

在最佳,最差和平均情况下,堆排序的性能为O(N LogN)。因为我们直接修改数组,所以堆排序不需要额外的空间。但是堆排序并不稳定,不会保留相同元素的顺序。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 基础堆排序和 Heapify 这一节我们介绍两个使用堆或者说基于堆的思想进行排序的算法。 思路1:一个一个地往最大...
    李威威阅读 12,456评论 0 4
  • 目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...
    robin2005阅读 5,744评论 0 2
  • 版本记录 前言 将数据结构和算法比作计算机的基石毫不为过,追求程序的高效是每一个软件工程师的梦想。下面就是我对算法...
    刀客传奇阅读 5,033评论 0 0
  • 堆排序的时间复杂度与归并排序相同为O(nlg n),空间复杂度与插入排序相同为O(1)。堆这种数据结构还用于优先队...
    Nautilus1阅读 4,474评论 1 0
  • 堆是一棵满足一定性质的二叉树,具体的讲堆具有如下性质:父节点的键值总是不大于它的孩子节点的键值(小顶堆), 堆可以...
    9527Roy阅读 3,964评论 0 0

友情链接更多精彩内容