数据结构与算法基础-学习-33-归并排序

news2024/12/28 19:10:50

目录

一、基本思想

二、算法思路

1、合并两个有序序列

2、分治法

三、算法源码

1、MergeSortTwoSortData

2、TwoWayMergeSortRecurtionSentryQueue

四、算法效率分析

五、Linux环境编译测试

六、小感慨


排序的其他相关知识点和源码分享可以参考之前的博客:   

《数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序》,

《数据结构与算法基础-学习-31-交换排序之冒泡排序、快速排序》,

《数据结构与算法基础-学习-32-选择排序之简单选择排序、堆排序》

一、基本思想

将两个或两个以上的有序子序列“归并”为一个有序序列。

在内部排序中,通常采用的是2路归并排序。

也就是将两个位置相邻的有序子序列R[l..m]和R[m+1..n]归并为一个有序序列R[l..n]。

二、算法思路

归并排序分两个部分进行实现,第一个部分就是将两个有序的序列合并成一个有序的序列。第二部分利用递归的思想将序列拆分成多个元素进行排序。

1、合并两个有序序列

(1)两个有序序列我们放在了一个数组中进行合并。Low和Mid分别表示Pre的起始和结束节点。Mid+1和High分别表示Tail的起始和结束节点。我们这里还是以升序为例,Pre的6和Tail的4进行比较4小,4插入到新的数组中。

(2)Tail前进一,Pre的6和Tail的5进行比较5小,5插入到新的数组中。

(3)Tail前进一,Pre的6和Tail的8进行比较6小,6插入到新的数组中。

(4)Pre前进一,Pre的9和Tail的8进行比较8小,8插入到新的数组中。

(5)Tail前进一,Tail已经超过High了,说明后半段有序序列已经访问完毕,这时只需把前半段的Pre开始遍历插入到新数组即可。

2、分治法

分治法其实就是把一个任务拆成多个小的任务,小的任务都完成了就把整个大任务完成了,是一种思想,上面是给的一个序列前后正好包含两组有序的数组,如果换成是无序数组呢,我们只需要把无需数组分成两半,左边使其有序,右边使其有序,在进行合并即可,左边可以再分为两块,有一种套娃的感觉,这个时候我们是不是会联想到递归,其实递归的练习做多了,就会有这种想法冒出来,希望对大家有帮助。

三、算法源码

1、MergeSortTwoSortData

//将队列中两个有序的序列进行合并。
//例如Low到Mid升序排列,Mid加一到High升序排列。合并为一个升序队列。
Status MergeSortTwoSortData(SqQueue* Queue,QueueLenType Low,QueueLenType Mid,QueueLenType High)
{
    JudgeAllNullPointer(Queue);

    if (Queue->Flag != INT_TYPE_FLAG)
    {
        return FailFlag;
    }
    
    QueueLenType Pre       = Low;
    QueueLenType Tail      = Mid + 1;
    int*         Array     = (int*)(Queue->Data);
    SqQueue*     TmpQueue  = NULL;
    QueueLenType i;

    InitSqQueue(&TmpQueue, High - Low + 1, INT_TYPE_FLAG);

    while (Pre <= Mid && Tail <= High)
    {
        if (Array[Pre] > Array[Tail])
        {
            EnterSqQueue(TmpQueue,&(Array[Tail]));
            Tail++;
        }
        else if (Array[Pre] < Array[Tail])
        {
            EnterSqQueue(TmpQueue,&(Array[Pre]));
            Pre++;
        }
        else//等于
        {
            EnterSqQueue(TmpQueue,&(Array[Tail]));
            EnterSqQueue(TmpQueue,&(Array[Pre]));
            Tail++;
            Pre++;
        }
    }
    
    while (Pre <= Mid)
    {
        EnterSqQueue(TmpQueue,&(Array[Pre]));
        Pre++; 
    }

    while (Tail <= High)
    {
        EnterSqQueue(TmpQueue,&(Array[Tail]));
        Tail++; 
    }
    
    for (i = Low; i <= High; i++)
    {
        LeaveSqQueue(TmpQueue,&(Array[0]));
        Array[i] = Array[0];
    }

    DestroySqQueue(&TmpQueue); 

    LogFormat(Debug,"Merge Sort Two Sort Data OK.\n");

    return SuccessFlag;
}

2、TwoWayMergeSortRecurtionSentryQueue

void TwoWayMergeSortRecurtionSentryQueue(SqQueue* Queue,QueueLenType Low,QueueLenType High)
{
    JudgeAllNullPointer(Queue);

    if (Low == High)
    {
        return;
    }
    else
    {
        QueueLenType Mid = (Low + High) / 2;
        TwoWayMergeSortRecurtionSentryQueue(Queue,Low,Mid);
        TwoWayMergeSortRecurtionSentryQueue(Queue,Mid + 1,High);
        MergeSortTwoSortData(Queue,Low,Mid,High);
    }
}

四、算法效率分析

情况时间复杂度是否稳定
最好O(n * log2^n)稳定
最坏O(n * log2^n)
平均O(n * log2^n)

五、Linux环境编译测试

[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c SwapSort.c SelectSort.c MergeSort.c BucketSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue
[gbase@czg2 Sort]$ ./TestSort 
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,5 ,6 ,7 ,8 ,9 ,0 ,1 ,2 ,3 ,4 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Init SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Enter SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Leave SqQueue OK
2023-9-11--[ Debug ]--Destroy SqQueue OK
2023-9-11--[ Debug ]--Merge Sort Two Sort Data OK.
2023-9-11--[ Debug ]--Two Way Merge Sort Sentry Queue OK.
2023-9-11--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-11--[ Info  ]--SqQueue Data   :
Data           : [ 9 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-11--[ Debug ]--Destroy SqQueue OK

六、小感慨

《C语言学习-20-归并排序》这篇是一年前写的,虽然实现方法上差不多,但是看到现在和之前的变化,感觉自己又进步了一小点,开心,大家一起加油。

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

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

相关文章

解决 Android 依赖冲突

解决办法 问题原因就是&#xff0c;各个模块所有的依赖&#xff08;递归&#xff09;的 jar 包最后都会加载到安卓的项目中&#xff0c;你可以选择 project 形式查看 External Libraries&#xff0c;都在这了。所以解决问题关键就是干掉冲突&#xff0c;剩下一个就行了&#xf…

将Apache服务与内网穿透结合,让您的网站可以公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

2023年中国电影行业研究报告

第一章 行业概况 1.1 定义 电影行业是一门涉及电影制作、发行、放映和推广的综合艺术和商业活动。它结合了戏剧、音乐、舞蹈、绘画等多种艺术形式&#xff0c;通过视觉和听觉的方式向观众展示故事和情感。 电影不仅仅是一门艺术&#xff0c;更是一项复杂的商业运作。它涵盖了…

element el-input 二次封装

说明&#xff1a;为实现输入限制&#xff0c;不可输入空格&#xff0c;长度限制。 inputView.vue <template><!-- 输入框 --><el-input:type"type":placeholder"placeholder"v-model"input"input"inputChange":maxle…

短信轰炸漏洞绕过的多种方法技巧

前言&#xff1a; 在测试甲方业务或者挖 SRC 等业务的时候&#xff0c;经常碰到发送短信验证的地方&#xff0c;我们可以联想到的就是任意用户登陆、短信轰炸、任意用户修改密码等逻辑性的漏洞&#xff0c; 简单的漏洞也是需要清晰的思维分析&#xff0c;拿几个短信轰炸多个绕…

实战系列(三)| Mybatis和MybatisPlus区别,包含详细代码

目录 1. 底层框架&#xff1a;2. 代码差异&#xff1a;3. 使用差异&#xff1a;4. 案例代码分析&#xff1a;4.1 MyBatis4.2 MyBatisPlus MyBatis 和 MyBatisPlus 都是基于 MyBatis 的扩展库&#xff0c;用于简化 MyBatis 的开发。MyBatisPlus 是在 MyBatis 的基础上进行封装&a…

华为云云耀云服务器L实例评测 | 华为云云耀云服务器L实例使用教学

文章目录 前言一、登录华为云二、创建云服务器L实例三、登录云服务器L实例四、使用云服务器L实例后记 前言 华为云是中国领先的云计算服务提供商之一&#xff0c;旗下的云耀云服务器是一种高性能、高可靠性、灵活可扩展的云服务器。 下面&#xff0c;我将为大家介绍华为云云耀云…

STM32-固件打包部署

STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件输出 工程上使用Keil开发STM32软件&#xff1b;在调试过程中&#xff0c;可直接编译下载&#xff1b;例如bootloader和APP&#xff0c;在调试时&#xff0c;可以直接下载2次&#xff1b;但是工程上&#xff0c;需要大…

第四章 Linux常用命令

第四章 Linux常用命令 1.Linux命令 ​ 要使用命令&#xff0c;必须先启动Shell程序。用户可以通过桌面右键打开终端&#xff0c;或使用CtrlAltT组合启动Shell&#xff0c;当然也可以从左侧dock面板上找到终端图标打开&#xff0c;打开后如下图&#xff1a; ​ Shell命令由命令…

真嘟假嘟?!这么清晰简单的字符函数和字符串函数!!!

目录​​​​​​​ 1. 字符分类函数 1.1 小练习 1.1.1 方法一 2. 字符转换函数 2.1 小练习的方法二 3. strlen的使⽤和模拟实现 3.1 注意事项 3.1.1 注意事项2的练习 3.2 strlen函数的模拟实现 3.2.1 方法一 3.2.2 方法二&#xff08;指针—指针&#xff09; 3.2.…

Unreal Engine Loop 流程

引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中&#xff0c;做了一个图。记录一下&#xff01;&#xff01; ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录&#xff0c;以备后用…

C++ 中 API 兼容与 ABI 兼容万字详解

文章目录 API 的生命周期兼容性级别向后兼容性向前兼容性功能兼容性源代码兼容性二进制兼容性 究竟是什么导致了二进制不兼容二进制不兼容可能导致的现象怎样维护源代码兼容添加功能修改功能弃用声明&#xff08;向后兼容&#xff09;移除功能&#xff08;向后兼容&#xff09;…

【大数据之Kafka】十、Kafka消费者工作流程

1 Kafka消费方式 &#xff08;1&#xff09;pull&#xff08;拉&#xff09;模式&#xff1a;消费者从broker中主动拉取数据。&#xff08;Kafka中使用&#xff09; 不足&#xff1a;如果Kafka中没有数据&#xff0c;消费者可能会陷入循环&#xff0c;一直返回空数据。 &#…

【性能测试】数据库优化

数据库优化 1. Oracle 1&#xff09;查询和修改数据库最大连接数 查看当前的数据库连接数: select count(*) from v$process; 数据库允许的最大连接数: select value from v$parameter where name processes; 修改数据库最大连接数: ----设置数据库最大连接数为2000 alte…

CSP 202305-2 垦田计划

直接用循环找最长天数的寻常写法只能拿15分&#xff0c;便运行超时结束了 #include <iostream> using namespace std; int main(){int n,m,k,t0;cin>>n>>m>>k;auto*datanew pair<int ,int>[n];for(int i0;i<n;i){cin>>data[i].first&g…

43.MQ—RabbitMQ

目录 一、MQ—RabbitMQ。 &#xff08;1&#xff09;同步调用与异步调用。 &#xff08;1.1&#xff09;同步调用。 &#xff08;1.2&#xff09;异步调用。 &#xff08;2&#xff09;MQ之间的区别。 &#xff08;3&#xff09;RabbitMQ学习。 &#xff08;3.1&#xf…

如何多号定时发朋友圈?

如何多号定时发圈&#xff1f; 通过定时发表朋友圈可以节省时间&#xff0c;保持账号信息更新的频率&#xff0c;在不同的适当时间进行宣传&#xff0c;让发布内容更精准的抵达目标客户&#xff0c;提高互动效果和阅读率&#xff0c;还可以防止朋友圈被折叠。 下面来看看是如何…

statistic learning outlook

supervised learning 贝叶斯估计 决策树与信息熵 信息熵 H ( D ) − ∑ i 1 n p ( X x i ) l o g ( P ( X x i ) ) − ∑ p i l o g ( p i ) H(D)-\sum_{i1}^n p(Xx_i)log(P(Xx_i))-\sum p_ilog(p_i) H(D)−∑i1n​p(Xxi​)log(P(Xxi​))−∑pi​log(pi​)&#xff0c;信…

帮助中心管理系统,人人都能用的知识管理平台

帮助中心管理系统是一种知识管理平台&#xff0c;旨在帮助企业有效组织和管理知识资源&#xff0c;使其能够为客户和员工提供快速、准确的帮助和支持。 关于帮助中心管理系统的重要特点和优势&#xff1a; 知识库管理&#xff1a; 帮助中心管理系统允许企业将知识组织和分类…

Vue3+Ts+Vite项目(第十二篇)——echarts安装与使用,vue3项目echarts组件封装

概述 技术栈&#xff1a;Vue3 Ts Vite Echarts 简介&#xff1a; 图文详解&#xff0c;教你如何在Vue3项目中引入Echarts&#xff0c;封装Echarts组件&#xff0c;并实现常用Echarts图例 文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、话不多数&#xff0c;引入 …