排序算法——归并排序

基本思想

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

图片实现

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

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

代码实现

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);
}
相关推荐
RAN_PAND4 分钟前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
Tiger Z8 分钟前
R 语言科研绘图第 27 期 --- 密度图-分组
开发语言·程序人生·r语言·贴图
左灯右行的爱情2 小时前
Redis数据结构总结-listPack
数据结构·数据库·redis
fai厅的秃头姐!2 小时前
C语言03
c语言·数据结构·算法
醉城夜风~2 小时前
[数据结构]单链表详解
数据结构·链表
lisanndesu3 小时前
动态规划
算法·动态规划
myprogramc3 小时前
十大排序算法
数据结构·算法·排序算法
记得早睡~3 小时前
leetcode150-逆波兰表达式求值
javascript·算法·leetcode
修己xj3 小时前
算法系列之贪心算法
算法
qy发大财3 小时前
跳跃游戏(力扣55)
算法·leetcode