【数据结构--八大排序】之归并排序

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、什么是归并排序
  • 二、思路:
  • 三、流程图:
    • 方法一(递归法)
      • 1.代码展示:
      • 2.测试结果
    • 方法二(非递归法)
      • 1.代码:
      • 2.测试结果:
  • 四、时间复杂度

一、什么是归并排序

归并排序:是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二、思路:

第一阶段:(下图1~2)采用分治的思想,使用递归的一直向下分割。最终每个元素为一组。如下图红色虚线位置。
第二阶段:(下图2~3)开始归并,合并分割好的两个数组,将其有序的存储到tmp数组中。向上归并,继续重复此步骤.
归并思路:合并两个有序数组。
最后,由于排序好的元素一直都是存到tmp数组中的,所以最后还需将tmp拷贝到a数组中。
补充:

拷贝数组时需要用到方法memcpy;

void * memcpy ( void * destination, const void * source, size_t num );

在这里插入图片描述

三、流程图:

在这里插入图片描述

方法一(递归法)

1.代码展示:

#include<string.h>//归并排序
void MergeSort(int* a, int* tmp, int begin, int end)
{//如果end <= begin结束向下递的过程。if (end <= begin)return;int mid = (begin + end) / 2;MergeSort(a, tmp, begin, mid);MergeSort(a, tmp, mid + 1, end);//走到这已经递归到头,开始回溯//每次都是合并两个有序数组归并到tmp数组中,最后在拷贝回a数组。//记录下当前坐标int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;//依次比较两个数组的值,选择小的放入数组tmp中。while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2] ){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}//如果begin1中还剩有元素,依次放入tmp中。while (begin1 <= end1){tmp[i++] = a[begin1++];}//如果begin2中还剩有元素,依次放入tmp中。while (begin2 <= end2){tmp[i++] = a[begin2++];}//将tmp拷贝回a数组。memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}MergeSort(a, tmp, 0, n - 1);free(tmp);
}

2.测试结果

int main()
{int a[10] = { 2, 6 ,7 ,5 ,9, 3 ,4 ,1 ,0 ,8 };MergeSort(a, 10);print(a, 10);return 0;
}

在这里插入图片描述

方法二(非递归法)

1.代码:

void MergeSortNon(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;// [begin1,end1] [begin2,end2] 归并int index = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[index++] = a[begin1++];}else{tmp[index++] = a[begin2++];}}while (begin1 <= end1){tmp[index++] = a[begin1++];}while (begin2 <= end2){tmp[index++] = a[begin2++];}// 拷贝回原数组memcpy(a + i, tmp + i, (2 * gap) * sizeof(int));}gap *= 2;}free(tmp);
}

2.测试结果:

int main()
{int a[10] = { 2, 6 ,7 ,5 ,9, 3 ,4 ,1 ,0 ,8 };MergeSortNon(a, 10);print(a, 10);return 0;
}

在这里插入图片描述

四、时间复杂度

时间复杂度:O(N*logN)

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

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

相关文章

目标检测YOLO实战应用案例100讲-基于端到端的自动驾驶道路环境目标检测

目录 前言 国内外研究现状 目标检测算法研究现状 骨干网络研究现状

Armv9 Cortex-A720的L2 memory system 和 L2 Cache

9 L2 memory system Cortex-A720核心的L2内存系统通过CPU bridge连接core与DynamIQ Shared Unit-120,其中包括私有的L2缓存。 L2缓存是统一的,每个Cortex-A720核心在一个集群中都有私有的L2缓存。 L2内存系统包括使用虚拟地址(VA)和程序计数器(PC)的数据预取引擎。不同…

Kolmogorov-Smirnov正态性检验

Kolmogorov-Smirnov正态性检验是一种统计方法&#xff0c;用于检验数据集是否服从正态分布。其基本原理和用途如下&#xff1a; 基本原理&#xff1a; 假设检验&#xff1a;Kolmogorov-Smirnov检验基于一个假设&#xff0c;即待检验的数据集服从特定的理论正态分布。计算累积…

【2023研电赛】华东赛区一等奖:电动叉车永磁同步电机MTPA及弱磁控制研究

本文为2023年第十八届中国研究生电子设计华东赛区一等奖竞赛作品分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&a…

Kakfa高效读写数据

1.概述 无论 kafka 作为 MQ 也好&#xff0c;作为存储层也罢&#xff0c;无非就是两个功能&#xff1a;一是 Producer 生产的数据存到 broker&#xff0c;二是 Consumer 从 broker 读取数据。那 Kafka 的快也就体现在读写两个方面了&#xff0c;本文也是从这两个方面去剖析Kafk…

nodejs+vue健身服务应用elementui

第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性&#xff1a;技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性&#xff1a; 11 3.3性能分析 11 3.4系统操作流程 12 3.4.1管理员登录流程 12 3.4.2信息添加流程 12 3.4.3信息删除流程 13 第四章 系统设计与…

数据结构与算法-(7)---栈的应用-(3)表达式转换

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

华为云云耀云服务器 L 实例评测:快速建站的新选择,初创企业和开发者的理想之选

华为云云耀云服务器 L 实例评测&#xff1a;快速建站的新选择&#xff0c;初创企业和开发者的理想之选 文章目录 华为云云耀云服务器 L 实例评测&#xff1a;快速建站的新选择&#xff0c;初创企业和开发者的理想之选导语&#xff1a;摘要&#xff1a; 正文产品概述部署简易性步…

【2023年11月第四版教材】第16章《采购管理》(第二部分)

第16章《采购管理》&#xff08;第二部分&#xff09; 5 过程1-规划采购管理5.1 规划采购管理5.2 采购管理计划★★★5.3 采购策略5.4 采购工作说明书★★★5.5 招标文件★★★ 6 过程2-实施采购6.1 采购文档 7 过程3-控制采购7.1 控制采购★★★ 8 合同管理8.1 合同的分类&…

在Windows11家庭中文版中启用Copilot(预览版)

1、下载ViveTool-vx.x.x.zip 2、解压下载的压缩包ViveTool-vx.x.x.zip 3、复制ViveTool文件夹的路径 4、按下wins&#xff0c;打开搜索 5、输入cmd&#xff0c;并选择“以管理员身份运行” 6、在cmd中输入以下命令&#xff0c;进入ViveTool文件夹&#xff1a; cd ViveTool…

C++数据结构与算法总结

C数据结构与算法 学习算法参考&#xff1a;https://www.hello-algo.com/ Visual Studio快捷键&#xff1a;https://learn.microsoft.com/zh-cn/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?viewvs-2019 启动时不调试 CtrlF5 设置文档格式 CtrlK、CtrlD …

BI神器Power Query(26)-- 使用PQ实现表格多列转换(2/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…

LitePal for Android

官网 https://github.com/guolindev/LitePal 中文文档 https://blog.csdn.net/guolin_blog/category_9262963.html 简介 An Android library that makes developers use SQLite database extremely easy. LitePal is an open source Android library that allows develope…

接雨水问题

接雨水问题 问题背景 LeetCode 42. 接雨水 接雨水问题是一个经典的计算雨水滞留量的问题&#xff0c;通常使用柱状图来表示不同高度的柱子。在下雨的情况下&#xff0c;柱子之间的凹陷部分能够存储雨水&#xff0c;问题的目标是计算这些柱子所能接收的雨水总量。 相关知识 …

[管理与领导-110]:IT人看清职场中的隐性规则 - 7 - 十二条职场真相

目录 一、不要向同事诉苦。 二、绝不估计公司的发展前景。 三、加薪幅度要互相保密。 四、对于那些看不顺眼的事情&#xff0c;尽可一笑了之&#xff0c;不必与之纠缠。 五、不要轻视任何的事与人。 六、要分清敌友。 七、自以为是的优越感容易招惹上司的嫉恨。 八、不…

windows系统利用powershell查看系统支持那些Windows功能选项

在PowerShell中&#xff0c;我们可以使用Get-WindowsOptionalFeature cmdlet命令来查看Windows功能选项。 打开PowerShell 输入以下命令&#xff1a;将结果输出到1.log Get-WindowsOptionalFeature -Online >1.log 可以看到在指定路径下看到生成了文件 打开查看内容&…

BI神器Power Query(27)-- 使用PQ实现表格多列转换(3/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…

Halcon中灰度直方图的使用与学习

目录 第一步:当前打开窗口的显示灰度图或者mono图片第二步:激活后,我们可以去调整调整右边直方图灰阶值的中蓝色和红色竖线,获取左边图上的灰阶值的范围内的特征显示。第三步:插入代码:总结:它的直观目的,就是查看灰度的分布情况!灰度直方图,是我们经常使用,抓取不同…

算法的时间复杂度分析习题专题

之前写了一篇重点是讲理论&#xff0c;今天重点在于对于题目的分析 题目难度不分先后&#xff0c;有题目来源会直接给出链接或者位置 第一题&#xff1a;消失的数字 题目来源&#xff1a;LeetCode消失的数字 分析 第一种思路分析&#xff1a; 参考代码&#xff1a; #include …

Git与Repo:开源开发的得力工具组合

Git与Repo&#xff1a;开源开发的得力工具组合 1. 引言 开源开发在当今的软件行业中扮演着至关重要的角色。它不仅推动了技术的创新和进步&#xff0c;也促进了开发者之间的合作与共享。随着越来越多的开源项目的涌现&#xff0c;有效的代码管理和版本控制成为了必不可少的工…