小白学算法2.7——堆排序

来源:互联网 发布:python ma优化 编辑:程序博客网 时间:2024/05/29 13:24

小白学算法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 0