归并排序详解

归并排序的基本思想:分治

目录

归并排序步骤

详细代码


归并排序步骤

确定中点:以数组中间值为分界点,mid=(l+r)/2
递归排序:以数组中间位置为界,对左右两部分分别排序,使得左右两部分分别变为两个有序数列
归并:将两个有序数组合并称为一个有序数组
归并方法:
用两个指针分别这项两个序列的最小值,之后比较两个数的大小,小的数存入新序列,并且其指针向后移,当其中一个指针移动到最后一个元素之后后,将剩余序列全部直接追加到新序列后面

由于不断地递归,所以每个小数组中数肯定都是排序好的,所以每个数组的最开始元素就是这个数组的最小值

详细代码

const int N = 100010;
int n;
int q[N];
int tmp[N];//用于存储合并后的序列
void merge_sort(int q[], int l, int r)
{
	if (l >= r) return;
	//确定中点
	int mid = (l + r) / 2;
	//递归排序
	merge_sort(q, l, mid);
	merge_sort(q, mid + 1, r); //当数组中只有1或2个数时,就会到递归的底部,从而执行下面代码,并逐步返回
	//归并
	int k = 0, i = l, j = mid + 1;
	//存入数据
	while (i <= mid && j <= r)
	{
		if (q[i] <= q[j]) tmp[k++] = q[i++];
		else tmp[k++] = q[j++];
	}
	//左/右某部分存完,存剩余的部分
	while (i <= mid) tmp[k++] = q[i++];
	while (j <= r) tmp[k++] = q[j++];
	//将原序列更新为排好序的新序列,如果使用vector,那么上面要用push,并且要在末尾将tmp进行clear
	for (i = l, j = 0; i <= r; i++, j++)
	{
		q[i] = tmp[j];
	}
}

最极端的情况,数组只有一个数字,这样就会将这两个数字排序成有序数组,向外返回一层,会有第二个有序数组,在将这两个合并,以此类推,最后就可以将整个数组进行排列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值