【数据结构】八大排序之堆排序算法

举报
修修修也 发表于 2024/09/30 16:38:53 2024/09/30
【摘要】 ​ 🦄个人主页:修修修也 🎏所属专栏:数据 结 构 ⚙️操作环境:Visual Studio 2022​编辑目录一.堆排序 简 介及思路 二.堆排序的代 码实现 三.堆排序的 时间 复 杂 度分析 结语 一.堆排序简介及思路堆排序(Heap Sort)是一种效率较高的选择排序算法.它是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它通过堆来进行选择数据.有关堆还不了解的朋友可以先移...

 

🦄个人主:修修修也

🎏所属专栏:数据

⚙️操作:Visual Studio 2022

​编辑


一.堆排序 介及思路

二.堆排序的代 码实现

三.堆排序的 时间 度分析

结语


一.堆排序介及思路

堆排序(Heap Sort)是一种效率较高的选择排序算法.

它是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它通过堆来进行选择数据.

有关还不了解的朋友可以先移步这篇文章:【数据 构】什么是堆 ?

它的基本思想是:

1. 将待排序的序列构造成一个大堆.(如果是降序建小堆)

2. ,整个序列的最大就是堆的根.将它移走(其就是我前面堆实现中的出堆操作).

3. 然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小(即堆).

4. 如此反复,就可以得到一个有序的序列了.

算法动图演示:

1.向下整建堆

逻辑结构:

​编辑

物理结构:

​编辑

2.堆排序(升序)

逻辑结构:

​编辑

物理结构:

​编辑


二.堆排序的代码实现

算法实现:(以升序)

1. 从最后一个叶子点的双亲节点开始向前遍并向下整建堆.

2. 建堆完成后,将堆元素与待排序列的最后一个元素做交.

3. 小待排序列范,使刚刚到最后的堆元素不再参与后的堆排序.

4. 重新将新堆元素向下,使堆恢复大堆.

5. 重复2-4步,直到数完全有序.

搞清实现步骤后,代码的实现就比较简单了,堆排序代码如下:

//交换函数

void Swap(int* a, int* b)

{

    int tmp = *a;

    *a = *b;

    *b = tmp;

}




//向下调整建堆

void AdjustDown(int* a, int n, int parent)

{

    int child = parent * 2 + 1;//默认是左孩子

    while (child < n)//孩子走到叶子就可以停止了

    {

        //选出左右孩子中大的那个

        if (child + 1 < n && a[child + 1] > a[child])//如果右孩子存在且大于左孩子

        {

            child++;

        }

        //向下调整重新使堆有序

        if (a[child] > a[parent])//建大堆

        {

            Swap(&a[child], &a[parent]);

            parent = child;

            child = parent * 2 + 1;

        }

        else

        {

            break;

        }

    }

}







//堆排序(升序

void HeapSort(int* a, int n)

{

    for (int i = (n - 1 - 1) / 2; i >= 0; i--)//先向下调整建堆

    {

        AdjustDown(a, n, i);

    }




    int end = n - 1;

    while (end > 0)

    {

        Swap(&a[end], &a[0]);//将堆顶元素和待排区间的最后一个元素交换




        AdjustDown(a, end, 0);




        end--;

    }

}

三.堆排序的时间度分析

堆排序方法数据数少的序列排序的效果并不很好,但n大的序列还是很有效的.

因为它的运行时间主要耗在建初始堆和整建堆时进行的反复"筛选"上.

         对深度k的堆,筛选算法中进行的字比次数至多2(k-1)次,则在建含n个元素,深度h的堆时,总共行的关字比次数不超4n.又因为n个结点的完全二叉树的深度为,则整建新堆时调用向下建堆函数n-1次,总共进行的比较次数不超过下式:

因此,堆排序在最坏的情况下,其时间度也O(nlogn),这是相对快排,堆排的最大优点.


结语

希望堆排序算法解能大家有所帮助,迎大佬留言或私信与我交流.

有关更多排序相关知可以移步:

【数据 构】八大排序算法 ​​ https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学,一起!

 相关文章推荐

【数据 构】八大排序之冒泡排序算法

【数据 构】八大排序之希 排序算法

【数据 构】八大排序之直接插入排序算法

【数据 构】八大排序之 简单选择 排序

【数据 构】八大排序之堆排序算法

【数据 构】八大排序之快速排序算法

【数据 构】八大排序算法之 并排序算法

【数据 构】八大排序之 数排序算法


数据构排序算法篇思维导图:

编辑


​编辑

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。