排序 -- 堆排序

堆排序  HeapSort

基于简单选择排序算法,属于选择排序类算法

属于:改进算法

平均:O(nlogn)    最好:O(nlogn)   最坏:O(nlogn)

稳定性:不稳定

辅助空间:O(1)

 

数据结构:堆(其实就是一种特殊的完全二叉树),可以利用数组实现这棵树


大顶堆:每个结点的值都大于或等于其左右孩子结点的值

小顶堆:每个结点的值都小于或等于其左右孩子结点的值

 

存储:数组实现,从上到下,从左右到依次存到数组中(完全二叉树就是爽)

 

堆排序思想:(大顶堆 -- > 升序)

将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造一个堆,这样就会得到n个元素中的次大值,反复执行,得到有序序列

 

空间复杂度来说:只用了一个用来交换的单元,很不错的,就地排序O(1)

 

由于初始构建堆的比较次数比较多,所以,并不适合待排序序列个数不多的情况!


说了这么多了,来点干货!下面是用C++实现的基于大顶堆的升序排序算法。

void heap_sort(int *a, int len)
{
    for(int i=len/2; i >= 0; i--)
    {
        heap_adjust(a,i,len-1);
    }

    for(int i=len-1; i > 0; i--)
    {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;

        heap_adjust(a, 0, i-1);
    }
}

void heap_adjust(int *a, int s, int m)
{
    int temp = a[s];
    for(int i=2*s+1; i <= m; i = i*2+1)
    {
        if(i < m && a[i] < a[i+1])
            i++;
        if(a[i] < temp)
            break;
        a[s] = a[i];
        s = i;
    }
    a[s] = temp;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值