小白学算法2.7——堆排序

小白学算法2.7——堆排序

标签: 小白学算法


1.堆排序算法

堆排序属于高级排序,时间复杂度为 O(NlogN) 。堆排序之所以叫堆排序是因为堆排序是基于二叉堆实现的优先队列实现的。

二叉堆的相关内容请阅读小白学算法1.3——堆
优先队列相关内容请阅读小白学算法1.4——优先队列

第一阶段:构造有序的二叉堆

把一个无序的堆有序化成一个二叉堆,最容易想到的一个算法就是从数组的左端向右,针对每个元素调用swim()方法,类似于向优先队列中一个一个插入元素的过程。不过一般情况下最容易想到的算法往往不是最好的算法。更好的方法是从这个树的最后一个父结点开始向前调用sink()方法,第一次调用sink()后有一个父结点及其子结点成为了子二叉堆堆,依次向前进行,直到这一层的的父结点及其子结点都是单独的子二叉堆,然后再针对上一层调用sink()方法,可以把属于同一个父结点的子二叉堆合成一个新的更大的子二叉堆……直到对根节点调用sink()方法后,一个有序的二叉堆就建立了。

第二阶段:下沉排序

将二叉堆中最大的结点(根结点)和最后的结点交换,将二叉堆的结点数目减一,然后对新的根结点调用sink()方法,进行堆的有序化。重复以上过程,直到二叉堆的结点数目为1为止,这个时候数组中的元素从左到右依次非递减变化。

2.堆排序实现

void heapSort(int* a, int n)
{
    //第一阶段
    for (int k=n/2; k>=1; k--)//a[n]是最后一个结点,其父节点为a[n/2]
        sink(a, n, k);
    //第二阶段
    while (n>1)
    {
        swap(a, 1, n--);
        sink(a, n, 1);
    }
}

3.总结

  • 堆排序是不稳定排序
  • 堆排序是唯一能够同时最优地利用时间和空间的算法
  • 堆排序在嵌入式或者低成本的操作系统中使用比较多,在现代操作系统中很少使用,因为其无法有效利用缓存
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值