排序算法之堆排序_20230624

news2024/10/6 20:30:54

排序算法之堆排序

  1. 前言

堆排序是基于比较排序的一类算法,算法重复利用堆(Binary heap)的特性,最大(最小)元素一定位于堆顶的位置,那么就可以提取堆顶元素,放置在数组的尾部位置,后再把剩余的元素进行堆处理,以此类推,最终完成排序任务。

  1. 堆定义

堆的定义如下,对于含有n个元素的序列
{ k 1 , k 2 , k 3 , . . . . , k n } \{k_1,k_2,k_3,....,k_n\} {k1,k2,k3,....,kn}
当且仅当满足下列关系时候,称之这个序列为堆(以大顶堆为例),

在这里插入图片描述

若将对应的此序列对应的一维数组看成是一个完全二叉树,则对的含义表明,完全二叉树中所有非终端节点的值均不小于其左、右孩子节点的值。由此,如果{k1,k2,…kn}是堆,则堆顶元素必为序列中n个元素的最大值。具体看一个例子,下面的完全二叉树则是一个大顶堆。值得一提的是,大顶堆中最小元素则可能位于任意叶子节点中,它并没有特别的规律。

在这里插入图片描述

在这里插入图片描述

上面两个大顶堆都是符合要求的合格大顶堆,大顶堆中最小元素值为9,它可能位于第④或第⑤或第⑥个位置上。所以在大顶堆中,并不能确认完全二叉树中的最小值所在确切位置。

若在输出堆顶的最小值之后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素中的次小值。如此反复执行,便能得到一个有序序列,这个过程便称之为堆排序(heap sort)

  1. 堆排序过程

综上所述,堆排序过程分为几个过程:

  • 首先需要对输入的n无序元素进行大顶堆化处理
  • 交换堆顶元素和序列中的最后一个元素
  • 再对前n-1元素进行大顶堆化处理
  • 交换堆顶元素和序列中最后一个元素
  • 重复上述操作直至序列中仅剩一个元素(最小元素)

3-1 输入无序元素进行大顶堆化处理过程

给定数组元素arr={4,10,3,5,1},要求通过完全二叉树建立大顶堆,过程如下,

在这里插入图片描述

可以观察到,上面的完全二叉树为大顶堆,通过交换堆顶元素和最后一个元素的值,交换发生后,堆中的元素数量减1,并重新对堆中的元素大顶化处理。

在这里插入图片描述

在这里插入图片描述

最终排序结果arr={1,3,4,5,10}

在这里插入图片描述

  1. 堆排序实现

4-1 对调整函数的实现

已知H.r[s…m]中记录的关键字除H.r[s]之外的均满足堆的定义要求,本函数调整H.r[s]关键字,使H.r[s…m]成为一个大顶堆。

void heap_adjust(HeapType *heap, int s, int m)
{
    int j;
    RcdType rc;
    rc=heap->r[s];

    for(j=2*s;j<=m;j=j*2)
    {
        if(j<m && LT(heap->r[j].key,heap->r[j+1].key))
        {
            j++;
        }

        //if rc.key is less than heap->r[j].key(j is larger between two values)
        if(!LT(rc.key,heap->r[j].key))
        {
            break;
        }

        heap->r[s]=heap->r[j];
        s=j;
    }

    heap->r[s]=rc;

    return;
}

4-2 堆排序实现

void heap_sort(HeapType *heap)
{
    int i;
    int n;
    RcdType rc;

    n=heap->length;

    for(i=n/2;i>0;i--)
    {
        heap_adjust(heap,i,n);
    }

    for(i=n;i>1;i--) //if there is one left(>1) and it had been sorted
    {
        rc=heap->r[i];
        heap->r[i]=heap->r[1];
        heap->r[1]=rc;

        heap_adjust(heap, 1, i - 1);
    }

    return;
}

  1. 小结

堆排序对记录较小的序列并不提倡,但是对于较大n的文件还是很有效的。因为其运行时间主要消耗在初建堆和调整新建堆的反复筛选上。堆排序在最坏情况下的时间复杂度为O(nlgn)。相对快速排序而言,这是堆排序的最大优点。此外,堆排序仅需要一个记录大小供交换用的辅助空间。

参考资料

并不提倡,但是对于较大n的文件还是很有效的。因为其运行时间主要消耗在初建堆和调整新建堆的反复筛选上。堆排序在最坏情况下的时间复杂度为O(nlgn)。相对快速排序而言,这是堆排序的最大优点。此外,堆排序仅需要一个记录大小供交换用的辅助空间。

参考资料

  1. Heap Sort - Data Structures and Algorithms Tutorials - GeeksforGeeks

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之状态模式笔记

设计模式之状态模式笔记 说明State(状态)目录状态模式示例类图抽象状态类环境角色类电梯开启状态类电梯关闭状态类电梯运行状态类电梯停止状态类测试类 说明 记录下学习设计模式-状态模式的写法。JDK使用版本为1.8版本。 State(状态) 意图:允许一个对象在其内部状态改变时改…

从零搭建一台基于ROS的自动驾驶车-----4.定位

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 从零搭建一台基于ROS的自动驾驶车-----1.整体介…

【Leetcode60天带刷】day25回溯算法——216.组合总和III,17.电话号码的字母组合

​ 题目&#xff1a; 216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1…

读书笔记--数据治理之术

继延续上一篇文章&#xff0c;对数据治理之术进行学习思考&#xff0c;这部分内容是本书整体内容的核心细节&#xff0c;内容比较多比较杂&#xff0c;通读了好长时间才动手总结整理&#xff0c;因此更新的慢了一些。数据治理之术是操作层面的技术或方法&#xff0c;数据治理相…

linux系统如何添加硬盘设备

前言&#xff1a; 今天记录一下硬盘方面的知识&#xff0c;主要讲一下分区、挂载方面的知识&#xff0c;心情太郁闷了&#xff0c;假期的最后一天。 1、硬盘的命名规则 现在的硬盘设备一般都会以“/dev/sd”开头&#xff0c;而一台主机上可以有多块硬盘设备&#xff0c;因此系…

6.24全球央行鹰派立场重现,下周黄金是否会继续下跌?

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五&#xff08;6月23日&#xff09;美市尾盘&#xff0c;现货黄金收报1920.44美元/盎司&#xff0c;上升6.58美元或0.34%&#xff0c;日内最高触及1937.46美元/盎…

Linux基础服务3——samba

文章目录 一、基本了解1.1 服务安装1.2 服务进程和端口1.3 samba用户1.4 配置文件1.4.1 主配置文件1.4.2 配置文件参数 1.5 安全级别 二、访问samba2.1 参数测试2.2 交互式访问2.3 挂载访问2.3.1 临时挂载2.3.2 永久挂载 2.4 配置用户认证共享2.5 匿名共享 一、基本了解 什么是…

VS Code基于服务器中的docker的开发环境配置

VS Code基于服务器中的docker的开发环境配置 基于Dev Containers插件基于Jump Machine&#xff08;跳板机&#xff09;服务器通过ssh连接docker容器VS Code配置ssh config文件连接docker容器 基于Dev Containers插件 当然可以在vscode中直接下载Dev Containers插件&#xff0c…

表上作业法一般流程(最小元素法、闭合回路法、位势法)

目录 一、列出物资调运平衡表和运价表 二、编制初始调运方案 三、初始方案的检验与调整 1&#xff09;闭合回路法 2&#xff09;位势法 3&#xff09;调整调运方案 表上作业法一般步骤&#xff1a; ①列出调运物资的供需(产销)平衡表及运价表&#xff1b; ②按最小元素…

mediapipe 谷歌高效ML框架-图像识别、人脸检测、人体关键点检测、手部关键点检测

参考&#xff1a; https://github.com/google/mediapipe https://developers.google.com/mediapipe/solutions/guide 框架也支持cv、nlp、audio等项目&#xff0c;速度很快&#xff1a; 1、图形识别 参考&#xff1a;https://developers.google.com/mediapipe/solutions/vi…

05.内存管理:动态申请和释放内存

动态分配内存&#xff0c;进行内存管理 参考: 伙伴算法原理简介 linux 0.11源码 本文主要针对Linux0.11的malloc和free进行分析。是一种类似伙伴系统的内存管理方法&#xff0c;不过伙伴系统的内存通常是申请大于一页的内存&#xff0c;但是在该内核版本的内存管理&#xff0c…

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 / LeetCode 235. 二叉搜索树的最近公共祖先(二叉搜索树性质,搜索与回溯)

题目&#xff1a; 链接&#xff1a;剑指 Offer 68 - I. 二叉搜索树的最近公共祖先&#xff1b;LeetCode 235. 二叉搜索树的最近公共祖先 难度&#xff1a;中等 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对…

redis存储原理与数据模型学习笔记

目录 1 redis线程模型1.1 线程组成1.2 redis命令处理是单线程 2 redis db 存储分析2.1 先了解代码server.hdict.h 2.2 从kv存储分析2.3 负载因子2.4 渐进式rehash机制数据访问scan 3 数据模型分析以zset为例跳表 1 redis线程模型 1.1 线程组成 redis-server 命令处理 网络事件…

Nerf论文前后介绍以及今后方向(2020年各个方向工作论文分析) NEURAL VOLUME RENDERING:NERF AND BEYOND

你好&#xff01; 这里是“出门吃三碗饭”本人&#xff0c; 本文章接下来将介绍2020年对Nerf工作的一篇总结论文NEURAL VOLUME RENDERING:NERF AND BEYOND&#xff0c;论文作者是佐治亚理工学院的Frank Dellaert同学和 MIT的Lin Yen-Chen同学&#xff0c;非常感谢两位大佬的总结…

序列化和反序列化的认识【protobuf、json、xml】

1. 什么是序列化与反序列化&#xff1f; 程序员在编写应用程序的时候往往需要将程序的某些数据存储在连续的内存中&#xff0c;然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化&#xff08;seri…

C++ array (STL array) 序列容器

文章目录 1 类模板2 begin()/end() 和 cbegin()/cend()3 cbegin() 和 cend()4 rbegin()/rend() 和 crbegin()/crend()5 访问array容器中单个元素参考 1 类模板 array 容器以类模板的形式定义在 头文件&#xff0c;并位于命名空间 std 中&#xff0c;如下所示&#xff1a; nam…

一、约束编程简介(Constraints Programming)

文章目录 1、约束编程求解器2、值域传播器THE END 1、约束编程求解器 \qquad 约束编程是一种编程范式&#xff0c;旨在解决那些需要满足一系列约束条件的问题。在约束编程中&#xff0c;问题被定义为一组变量和约束条件&#xff0c;而不是指定解决问题的算法步骤。通过定义变量…

XXE漏洞复现步骤

0X00XXE注入定义 XXE注入&#xff0c;即XML External Entity&#xff0c;XML外部实体注入。通过 XML 实体&#xff0c;”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值&#xff0c;是处理程序解析它…

Nginx-负载均衡详解

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Nginx什么是负载均衡 功能介绍配置过程1.修改nginx配置文件添加服务组修改HTTP模块 2.保存配置文件3.重启配置文件4.查看配置文件是否重启成功5.还可以配置其他策略轮询权重最少连接数 常用命令总结提升 概念说明 了解ngi…

MySQL:环境安装和数据库基础

环境安装 说明&#xff1a; • 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;⼀旦 安装&#xff0c;普通用户能使⽤的 • 初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使⽤root进行&#xff0c;尽快适应mysql语句&#xff0c;后⾯学了用户管 理&a…