堆排序

原创 2018年04月16日 15:07:35

堆,分为大根堆和小根堆。大根堆是一颗父节点的值大于孩子节点的值的完全二叉树,小根堆反之。

堆排序,是一种选择排序。它的最好最坏和平均时间复杂度均为O(nlgn)。

堆排序是不稳定的排序。

堆排序主要分为两个过程:1.建堆;2.调整堆。

例:

134253

数组a[] = {1, 3, 4, 2, 5, 3}, 首先建一个堆。根据调整,使其满足大根堆,a[i] >= a[i*2+1] && a[i] >= a[i*2+2]。

    经过调整变成堆  

此时,堆顶元素即a[0], 为最小的数。

然后把a[0],和最后一个元素交换,将a[0...n-2]调整为堆。

   

调整完成后,堆顶元素为a[0...n-2]里最小的数,再讲a[0]和a[n-2]交换,继续调整a[0...n-3]。

        

重复以上步骤

       



经过n-1次操作,以上堆已经变成了一个有序的数组,这就是堆排序。

void Heapify(int a[], int s,int m)
{
    int x = a[s];
    int j = 2 * s + 1;
    while(j < m)
    {
        if(j+1 < m && a[j] > a[j+1])
            j++;
        if(x < a[j])
            break;
        a[s] = a[j];
        s = j;
        j = j*2 + 1;
    }
    a[s] = x;
}
void BuildHeap(int a[], int n)
{
    for(int i = (n-1)/2; i >= 0; i--)
        Heapify(a, i, n);

}

void Heap_Sort(int a[], int n)
{
    BuildHeap(a, n);
    for(int i = n - 1; i > 0; i--)
    {
        a[0] += a[i];
        a[i] = a[0] - a[i];
        a[0] = a[0] - a[i];
        Heapify(a, 0, i);
    }
}


此外,求第k大(小)数,也经常使用堆来求解。


-------------------

End

几种排序总结(上)——堆排序

堆排序 这几天看了算法导论的排序部分,作一下总结。 堆排序的优点        1)最坏情况下o(nlgn)的时间复杂度        2)就地排序,不用辅助数组 几种操作(以最大堆...
  • lawrencesgj
  • lawrencesgj
  • 2012-10-17 17:17:01
  • 3184

java堆排序递归代码,无原理版,比较好理解

public class HeapOperate2 { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static v...
  • zhuqiuhui
  • zhuqiuhui
  • 2016-04-21 23:29:27
  • 1436

堆排序原理及其实现(C++)

堆排序原理及其实现(C++)1 堆排序的引入 我们知道`简单选择排序`的时间复杂度为O(n^2),熟悉各种排序算法的朋友都知道,这个时间复杂度是很大的,所以怎样减小简单选择排序的时间复杂度呢?从上...
  • yanglr2010
  • yanglr2010
  • 2016-10-18 21:48:02
  • 5467

堆排序图片详解

堆排序实例 首先,建立初始的堆结构如图: 然后,交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,...
  • u011068702
  • u011068702
  • 2016-10-09 15:23:27
  • 1503

堆排序以及其应用大总结

教材上很详细,网上内容也不少,但感觉不够直观、简练、丰富。下面按照自己方式总结下。 提纲: 1)算法描述 2)代码 3)“三围”以及证明(复杂度、效率、稳定性等分析) 4)算法直接应用 5...
  • zhq651
  • zhq651
  • 2012-08-29 01:52:19
  • 10337

优化的堆排序

优化的堆排序体现在不需要重新生成一个数组,而是直接原地进行所谓的堆排序。 首先,对于一个杂乱的数组,我们首先对所有的非叶子节点进行shiftdown操作,使得堆顶arr[0]的元素为最大值,如下图所...
  • qq_19782019
  • qq_19782019
  • 2017-11-06 13:42:05
  • 196

java堆排序非递归代码,无原理版,比较好理解

public class HeapOperate { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static vo...
  • zhuqiuhui
  • zhuqiuhui
  • 2016-04-21 23:01:59
  • 898

堆排序【模板】

很认真地看完了《算导》的排序之前的所有部分,除了算法复杂度那一章的数学要求太高,难以完全驾驭以外,其他的部分还是很好理解的。。。 争取把《算导》里面出现的算法都自己实现,制作自己的模板,以后好用。。。...
  • Scythe666
  • Scythe666
  • 2013-10-30 11:42:37
  • 1098

堆排序 纯C代码

跟上一篇实现思路一样,感觉还是少出现点幻数比较好,由于heapAdjust()调用频繁,故要尽量提高这段代码的效率 #include #define N 1000 #define INF 99...
  • architect19
  • architect19
  • 2013-05-13 22:44:30
  • 4847

【数据结构与算法】内部排序之三:堆排序(含完整源码)

堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用...
  • mmc_maodun
  • mmc_maodun
  • 2014-03-04 00:01:45
  • 23558
收藏助手
不良信息举报
您举报文章:堆排序
举报原因:
原因补充:

(最多只允许输入30个字)