堆排序

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

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

假设要排序的数组是:

[ 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)。因为我们直接修改数组,所以堆排序不需要额外的空间。但是堆排序并不稳定,不会保留相同元素的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值