Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2021年11月 C#版 数据结构与算法解析(选择排序-堆排序)

【愚公系列】2021年11月 C#版 数据结构与算法解析(选择排序-堆排序)

作者头像
愚公搬代码
发布于 2021-12-03 08:43:06
发布于 2021-12-03 08:43:06
23300
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

1、堆排序(Heap Sort)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

1.1 算法描述

  • 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  • 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  • 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

1.2 动图演示

1.3 代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 
/// 堆排序
/// 
public class Program {

    public static void Main(string[] args) {
        int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };

        HeapSort(array);
        ShowSord(array);

        Console.ReadKey();
    }

    private static void ShowSord(int[] array) {
        foreach (var num in array) {
            Console.Write($"{num} ");
        }
        Console.WriteLine();
    }

    private static void HeapSort(int[] array) {
        MaxHeap(array);
        for (int i = array.Length - 1; i > 0; i--) {
            Swap(ref array[0], ref array[i]);
            Heapify(array, 0, i);
        }
    }

    private static void MaxHeap(int[] array) {
        for (int i = array.Length / 2 - 1; i >= 0; i--) {
            Heapify(array, i, array.Length);
        }
    }

    private static void Heapify(int[] array, int index, int size) {
        int left = 2 * index + 1;
        int right = 2 * index + 2;
        int large = index;

        if (left < size && array[left] > array[large]) {
            large = left;
        }
        if (right < size && array[right] > array[large]) {
            large = right;
        }
        if (index != large) {
            Swap(ref array[index], ref array[large]);
            Heapify(array, large, size);
        }
    }

    private static void Swap(ref int first, ref int second) {
        int t = first;
        first = second;
        second = t;
    }

}

堆排序算法的时间复杂度不难证明为: O(n*logn) 。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
堆排序
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
用户2909867
2018/08/22
3920
【愚公系列】2023年11月 十一大排序算法(六)-堆排序
排序算法是一种将一组数据按照特定的规则进行排列的方法。排序算法通常用于对数据的处理,使得数据能够更容易地被查找、比较和分析。
愚公搬代码
2023/11/25
2350
算法 – 堆排序(C#)
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net
全栈程序员站长
2022/09/14
2640
十大排序算法
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
CodeWwang
2022/08/24
3650
十大排序算法
排序算法之堆排序
堆排序(Heapsort)是一种利用堆这种数据结构设计的排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或大于)它的父节点。堆排序是一种利用堆的概念来排序的选择排序变种。分为两种方法:每个节点的值都大于等于其左右孩子节点的值,称为大顶堆;或者每个节点的值都小于等于其左右孩子节点的值,称为小顶堆。该算法的时间复杂度为 O(n log n)。
用户11397231
2024/12/10
2230
排序算法之堆排序
堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
Java架构师必看
2021/07/13
3470
【愚公系列】2021年11月 C#版 数据结构与算法解析(选择排序-简单选择排序)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
愚公搬代码
2021/12/03
1920
【愚公系列】2021年11月 C#版 数据结构与算法解析(选择排序-简单选择排序)
Python|堆排序
外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
福贵
2020/02/17
4020
算法渣-排序-堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
码农戏码
2021/03/23
3890
十大排序——最全最详细,一文让你彻底搞懂
(注:文章中的算法顺序是按照下面的图片中的分类进行,你可以不按照这个顺序。根据你的个人喜好、时间以及上面的侧重点分析,按照自己的需求学习即可。)
全栈程序员站长
2022/09/15
1K0
十大排序——最全最详细,一文让你彻底搞懂
堆排序思想分享
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。堆是一棵完全二叉树,具有堆属性:对于最大堆,每个节点的值都大于或等于其子节点的值;对于最小堆,每个节点的值都小于或等于其子节点的值。堆排序利用了堆的这一特性来实现高效的排序。
人不走空
2024/07/01
1490
面试官:手撕十大排序算法,你会几种?
2020年7月24日,阴,气温15摄氏度,已经两天没有涨粉丝了,一个人运营公众号确实有些吃力。尽管这样,也不影响我前进的脚步,搬砖的路上,我们一起加油!!!
C you again
2020/09/10
4810
十大经典排序算法最强总结(含Java、Python码实现)
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
10JQKA
2020/12/31
1.1K0
堆排序算法的java实现
堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlog2n) ,堆排序的堆序的平均性能较接近于最坏性能。
sanmutongzi
2020/03/05
7150
手敲一遍数据结构和排序算法 Java
​ 不管元素在什么情况下都要做这些步骤,所以花销的时间是不变的,所以该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )
小锋学长生活大爆炸
2022/03/29
4760
手敲一遍数据结构和排序算法 Java
C#堆排序算法
堆排序(Heap Sort)是一种基于比较的排序算法,利用了二叉堆的数据结构。在堆排序中,我们首先将待排序的数组构建成一个最大堆(或最小堆),然后逐个从堆中取出最大的元素(或最小的元素),将其放到数组的末尾,同时重新调整剩余元素构成的堆,直到堆中没有元素为止。
Michel_Rolle
2024/10/10
3.3K0
堆排序(HeapSort)之java实现
堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2,如果有父节点,父节点的位置是(n-1)/2取整。分为最大堆和最小堆,最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。所谓堆排序就是利用堆这种数据结构来对数组排序,我们使用的是最大堆。处理的思想和冒泡排序,选择排序非常的类似,一层层封顶,只是最大元素的选取使用了最大堆。最大堆的最大元素一定在第0位置,构建好堆之后,交换0位置元素与顶即可。堆排序为原位排序(空间小), 且最好与最坏运行时间是都是O(nlogn)。而且堆排序还是原地算法(in-place algorithm),是渐进最优的比较排序算法。
MickyInvQ
2020/09/27
1.7K0
秒懂排序算法
作者:郭耀华,来自:cnblogs.com/guoyaohua 0、排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度:运行完一个程序所需内存的大小。 0.3
架构师小秘圈
2018/04/02
1K0
秒懂排序算法
十大排序
首先排序算法可以分为内部排序算法和外部排序算法:在内存中进行的称为内部排序算法,也就是这里所说的这十种算法;相应的,当数据量很大时无法全部拷贝到内存需要使用外存,称为外部排序算法。接下来我们可用如下表来简单概括这十种算法:
橘子君丶
2023/03/06
3250
十大排序
C#堆排序算法
堆排序是一种高效的排序算法,基于二叉堆数据结构实现。它具有稳定性、时间复杂度为O(nlogn)和空间复杂度为O(1)的特点。
追逐时光者
2023/10/10
2540
C#堆排序算法
相关推荐
堆排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验