堆排序(Heap Sort)

算法描述:为解决选择排序查找最小元的 O(N) 问题(降低为 O(LogN) ),将待排序序列构建为最大堆,将其根节点与其最后一个叶子节点交换,交换后除去最后一个叶子节点构建最大堆继续排序。堆排序的动态图示如下所示:
  这里写图片描述

复杂度分析:最坏时间复杂度为 O(NlogN) ,平均时间复杂度也为 O(NlogN) ,效率较高。

主要特点:

  • 不稳定;
  • 不占用额外内存;
  • 但需要构建最大堆,较为麻烦。

C语言描述:

#include<stdio.h>
typedef int ElementType;

void Swap(ElementType *A, ElementType *B) {
    ElementType temp = *A;
    *A = *B;
    *B = temp;
}

/* 将N个元素的数组中以A[root]为根的子堆调整为最大堆 */
void PercDown(ElementType Data[], int root, int N) {
    int Parent, Child;
    ElementType X = Data[root]; /*取出根结点存放的值*/
    for (Parent = root; Parent * 2 + 1 < N; Parent = Child) {
        Child = Parent * 2 + 1;
        if ((Child != N - 1) && Data[Child] < Data[Child + 1])
            Child++; /*Child指向左右子结点的较大者*/
        if (X >= Data[Child]) break; /*找到了合适位置*/
        else Data[Parent] = Data[Child]; /*下滤X*/
    }
    Data[Parent] = X;
}

/* 堆排序C语言描述 */
void Heap_Sort(ElementType Data[], int N) {
    int i;
    for (i = N / 2 - 1; i >= 0; i--) /*建立最大堆*/
        PercDown(Data, i, N); 
    for (i = N - 1; i > 0; i--) {
        Swap(&Data[i], &Data[0]); /*删除最大堆顶*/
        PercDown(Data, 0, i);
    }
}

int main() {
    ElementType Data[] = {19, 3, 10, 20, 22, 28, 33, 23, 15, 30};
    Heap_Sort(Data, 10);
    return 0;
}

附:特殊说明

  • 定理:堆排序处理N个不同元素的随机排列的平均比较次数为 2NlogNO(NloglogN)
  • 虽然堆排序给出最佳平均时间复杂度,但实际效果不如用Sedgewick增量序列的希尔排序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值