排序算法——归并排序

基本思想

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

图片实现

就是把上面的数组一直按照一半拆开,然后拆到都是单个数字。然后再按照相反的逻辑进行逐层递归。

下面是动图,大家也可以看一下。

代码实现

复制代码
void _mergesort(int* a, int begin, int end, int* tmp)
{
	if (begin >= end)
		return;
	//将数据拆分
	int mid = (begin + end) / 2;
	_mergesort(a, begin, mid, tmp);
	_mergesort(a, mid+1, end, tmp);
	//递归
	int begin1 = begin, end1 = mid;
	int begin2 = mid + 1, end2 = end;
	int i = begin;
	while (begin1<=end1&&begin2<=end2)
	{
		if (a[begin1] < a[begin2])
		{
			tmp[i++] = a[begin1++];
		}
		else
			tmp[i++] = a[begin2++];
	}
	while (begin1 <= end1)
	{
		tmp[i++] = a[begin1++];
	}
	while (begin2 <= end2)
	{
		tmp[i++] = a[begin2++];
	}
	memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc");
		return;
	}
	_mergesort(a, 0, n - 1, tmp);
	free(tmp);
}
相关推荐
珂朵莉MM14 分钟前
2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组(国赛)解题报告 | 珂学家
开发语言·人工智能·算法·leetcode·职场和发展·深度优先·图论
小智学长 | 嵌入式23 分钟前
进阶-数据结构部分:2、常用排序算法
java·数据结构·算法
少了一只鹅23 分钟前
字符函数和字符串函数
c语言·算法
Dr.9271 小时前
1-10 目录树
java·数据结构·算法
双叶8361 小时前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
ocean10102 小时前
项目管理学习-CSPM-4考试总结
学习·程序人生
子豪-中国机器人2 小时前
C++ 蓝桥 STEMA 省选拔赛模拟测试题(第一套)
开发语言·c++·算法
callJJ2 小时前
Bellman - Ford 算法与 SPFA 算法求解最短路径问题 ——从零开始的图论讲解(4)
数据结构·算法·蓝桥杯·图论·单源最短路径·bellman- ford算法
圈圈编码2 小时前
LeetCode Hot100刷题——轮转数组
java·算法·leetcode·职场和发展
序属秋秋秋2 小时前
我的创作纪念日——《惊变256天》
学习·程序人生·学习方法