排序算法7----归并排序(C语言)

        1、基本思想

        归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。

        将无序的序列分解到单个元素,然后将有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。

        若将两个有序表合并成一个有序表,称为二路归并。

        2、核心步骤

        3、代码实现

         3、1主要核心代码

void SubMergeSort(int* arr, int begin, int end, int* tmp)
{//分解//将arr数组分成n个单个元素//分解结束条件:begin>=end,即已经分解到单个元素if (begin >= end)return;//从每个区间的中间开始分,每次分解会将一个区间分解为两个区间int mid = (begin + end) / 2;//递归分解SubMergeSort(arr, begin, mid, tmp);SubMergeSort(arr, mid + 1, end, tmp);//合并//因为一个区间分解后得到两个区间,先定义这两个区间的始末位置int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;//定义每两个有序子序列放入tmp数组中的下标i//这个begin是这两个相邻有序子序列分解前的区间的beginint i = begin;//将两个有序子序列放入tmp//一个元素也叫有序while (begin1 <= end1 && begin2 <= end2){//由于两个子序列已经有序,故我们只需要从两个子序列的起始处开始比较if (arr[begin1] < arr[begin2])tmp[i++] = arr[begin1++];elsetmp[i++] = arr[begin2++];}//while结束时,代表其中的一个begin已经大于end了//代表有一个子序列已经全部放入tmp//接下来只需要将另一个子序列剩下的元素放入tmpwhile (begin1 <= end1)//代表第二个子序列已经放完,现在放第一个{tmp[i++] = arr[begin1++];}while (begin2 <= end2){tmp[i++] = arr[begin2++];}//到这,两个有序子序列已经合并到一个有序序列//将这个有序序列在tmp中对应位置,拷贝回到arr中对应位置//这样下次才能从arr中再次将两个有序子序列再合并为一个有序序列放入tmp中//当已经将arr的最后两个有序子序列合并到tmp中后,tmp已经有序,再拷贝回去,arr就有序memcpy(arr + begin, tmp + begin, sizeof(int) * (end - begin + 1));//这里+begin,就是对应上边第二点的对应位置//从哪个区间分解出来,就放回哪个区间
}

        3、2辅助代码

void MergeSort_incline(int* arr, int n)
{//建立tmp数组来重新排序,排序完成后将tmp拷贝给arrint* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail\n");exit(-1);}SubMergeSort(arr, 0, n - 1, tmp);free(tmp);tmp = NULL;
}

        4、实现效果

	int arr[] = { 3,4,8,10,1,7,1,5,2,8,2 };int n = sizeof(arr) / sizeof(int);printf("原数组: ");PrintArray(arr, n);printf("\n");printf("排序后: ");MergeSort_incline(arr, n);PrintArray(arr, n);

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

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

相关文章

React16源码: React中的异步调度scheduler模块以及时间片源码实现

React Scheduler 1 ) 概述 react当中的异步调度&#xff0c;称为 React Scheduler发布成单独的一个 npm 包就叫做 scheduler这个包它做了什么&#xff1f; A. 首先它维护时间片B. 然后模拟 requestIdleCallback 这个API 因为现在浏览器的支持不是特别的多所以在浏览当中只是去…

使用scipy处理图片——旋转任意角度

大纲 载入图片左旋转30度&#xff0c;且重新调整图片大小右旋转30度&#xff0c;且重新调整图片大小左旋转135度&#xff0c;保持图片大小不变右旋转135度&#xff0c;保持图片大小不变 在《使用numpy处理图片——90度旋转》中&#xff0c;我们使用numpy提供的方法&#xff0c;…

【PostgreSQL】函数与操作符-逻辑操作符

PostgreSQL常用的操作符 算术操作符&#xff1a;PostgreSQL支持基本的算术操作符&#xff0c;包括加法&#xff08;&#xff09;、减法&#xff08;-&#xff09;、乘法&#xff08;*&#xff09;、除法&#xff08;/&#xff09;和取模&#xff08;%&#xff09;等。可以使用这…

命令行登录Mysql的详细讲解

目录 前言1. 本地登录2. 远程登录3. 拓展 前言 对于命令行登录Mysql一般都是用mysql -u root -p 但对于如何远程登陆&#xff0c;一直其他的参数还是有些盲区&#xff0c;对此总结科普 对于登录过程中出现的问题&#xff0c;可看我之前的文章&#xff1a; 服务器 出现ERROR …

Dreambooth Stable Diffusion始化训练环境(AutoDL)

以AutoDL为例 以下代码源自&#xff1a;赛博华佗——秋叶&#xff1a; Akegarasu 环境选择 Miniconda: Miniconda是一个轻量级的Conda环境管理系统。它包含了conda、Python和一些常用的包&#xff0c;以及能够管理安装其他包的能力。Miniconda是Anaconda的一个简化版&#xff0…

聊聊PowerJob的Alarmable

序 本文主要研究一下PowerJob的Alarmable Alarmable tech/powerjob/server/extension/Alarmable.java public interface Alarmable {void onFailed(Alarm alarm, List<UserInfoDO> targetUserList); }Alarmable接口定义了onFailed方法&#xff0c;其入参为alarm及tar…

【矩阵快速幂】封装类及测试用例及样例

作者推荐 视频算法专题 通俗的说&#xff0c;就是矩阵的乘方。 封装类 核心代码 class CMat { public:// 矩阵乘法static vector<vector<long long>> multiply(const vector<vector<long long>>& a, const vector<vector<long long>…

使用Python管理MySQL数据库,有录播直播私教课视频教程

查看所有数据库 from mysql.db_object import Databasedb Database(host"localhost",port3306,database"",username"root",password"zhangdapeng520" ) print(db.get_all_database())删除数据库 from mysql.db_object import Datab…

Python 面向对象之元类

Python 面向对象之元类 【一】一切皆对象 【1】元类 元类&#xff08;metaclass&#xff09;是Python中用于创建类的类。在Python中&#xff0c;类是对象&#xff0c;而元类就是类的类它们控制类的创建过程&#xff0c;允许你定制类的行为Python中内置的默认元类是type我们用…

Android JNI与Java类的转换调用

1. 前言 一般在Android中&#xff0c;对于JNI的调用&#xff0c;基本的数据类型就能满足要求了&#xff0c;具体可以看我的这一篇文章 : Android JNI/NDK 入门从一到二&#xff0c;但是最近在项目中遇到了基本类型满足不了需要的情况&#xff0c;需要在JNI中创建并操作Java类&…

Rust-语句和表达式

if-else Rust中if-else表达式的作用是实现条件分支。if-else表达式的构成方式为&#xff1a;以if关键字开头&#xff0c;后面跟上条件表达式&#xff0c;后续是结果语句块&#xff0c;最后是可选的else块。条件表达式的类型必须是bool。 if-else结构还可以当表达式使用 loop …

如何用LLM和自有知识库搭建智能agent?

用LangChain建立知识库&#xff0c;文末中也推荐其他方案。 项目源码&#xff1a;ChatPDF实现 LangChain Indexes使用 对加载的内容进行索引&#xff0c;在indexes中提供了一些功能&#xff1a; Document Loaders&#xff0c;加载文档Text Splitters&#xff0c;文档切分V…

nautilus`文件管理器打开文件管理器

使用nautilus文件管理器打开文件管理器&#xff0c;并使用管理员权限。以下是使用命令行的步骤&#xff1a; 打开终端&#xff08;命令行界面&#xff09;&#xff0c;你可以通过按下Ctrl Alt T组合键来打开终端。 在终端中&#xff0c;使用以下命令以管理员权限打开文件管理…

开发实践5_后台管理^/ 分_页器

以下学习 朔宁夫 开发课 。&#xff08;Python&#xff09; 一 基本使用 创建超级用户 terminal // python manage.py createsuperuser 访问地址 //Log in | Django site adminhttp://127.0.0.1:8000/admin/login/?next/admin/ superuserr login django自带admin功能。其…

一文读懂「Prompt Engineering」提示词工程

在了解提示过程之前&#xff0c;先了解一下什么是提示prompt&#xff0c;见最后附录部分 一、什么是Prompt Engingering&#xff1f; 提示工程&#xff08;Prompt Engingering&#xff09;&#xff0c;也被称为上下文提示&#xff08;In-Context Prompting&#xff09;&#x…

Django项目中的默认文件都有什么用

manager.py&#xff1a; 是django用于管理本项目的命令行工具&#xff0c;之后进行站点运行&#xff0c;数据库自动生成等都是通过本文件完成。 djangoStudy/__init__.py&#xff1a; 告诉python该目录是一个python包&#xff0c;暂无内容&#xff0c;后期一些工具的初始化可…

【数据库】间隙锁Gap Lock

什么是间隙锁 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;间隙锁是&#xff08;RR级别下&#xff09;一个在索引记录之间的间隙上的锁&#xff0c;可以是两个索引记录之间&#xff0c;也可能是第一个索引记录之前或最后一个索引之后的空间。间隙锁&#xff08;Gap Lo…

Github登录时,要二次验证.Github 2FA登录问题

2023下半年, Github登录时,要二次验证. 点击“Enable 2FA now”跳到2FA验证界面。 点setup key是到secret串。 这里有一个可以不用app的验证方法。填入secret串,运行后,会得到验证码. https://blog.csdn.net/dejavu_980323/article/details/132318107 按照这个文章,得到验证…

记csv、parquet数据预览一个bug的解决

文章目录 一、概述二、实现过程1. 业务流程2. 业务逻辑3. 运行结果 三、bug现象1. 单元测试2.运行结果 三、解决思路1. 思路一2. 思路二 一、概述 工作中遇到通过sparksession解析csv、parquet文件并预览top100的需求。 二、实现过程 1. 业务流程 #mermaid-svg-Tzp1pJTvJunU…

227. Basic Calculator II

227. Basic Calculator II class Solution:def calculate(self, s: str) -> int:ititer(re.split(r([\\-\*\/]),s))lastansint(next(it))for op in it:nint(next(it))if op in -:if op-:n-nansnelse:if op*:nlast*nelse:nint(last/n)ansans-lastnlastnreturn ans 注意这个…