# # 0002 | 归并排序

54 阅读1分钟

# 0002 | 归并排序

以下是代码实现:

#include <cstdio>
#include <iostream>

using namespace std;

const int N = 1e6 + 10;
int q[N], tmp[N], n;

void mergy_sort(int q[], int l, int r)
{
	if(l >= r)	return;
	 
	int mid = l + r >>1, i = l, j = mid + 1, k = 0;
	
	mergy_sort(q, l, mid), mergy_sort(q, mid + 1, r);
	
	while(i <= mid && j <= r)
	{
		if(q[i] <= q[j])	tmp[k ++] = q[i ++];
		else	tmp[k ++] = q[i ++];
	}
	if(i <= mid)	tmp[k ++] = q[i ++];
	if(j <= r)	tmp[k ++] = q[j ++];
	
	for(int i = 0, k = 0; i < n; i ++ k ++)		p[i] = tmp[k];
	
}

int main()
{
	scanf("%d", &n);
	
	for(int i = 0; i < n; i++)	scanf("%d", &q[i]);
	
	mergy_sort(q, 0, n-1);
	
	for(int i = 0; i < n; i++)	printf("%d", q[i]);
	
	return 0;
}

算法思想

一分为二

首先将该数组以 mid 中心值为枢轴, 我们将这个数组上的数,一分为二

递归

其次,我们再进行递归,递归数轴上两边的数。

归并

最后在进行归并,和二为一。

总结

其中对于两段数组,我们使用双指针的方法,统一为左起点,进行比较排序,较小的数放入新开辟的数组中。

对于快速排序,归并排序较为稳定(稳定性,在一段输入的数中,放在数轴上, 对于相同的数比较中,如果 A1 在 A2 前面,排序后的地址A1 还在 A2 前面, 我们可以知道这个排序方法是稳定的)。而在快速排序中,我们是 期望 x == mid 的 。

在时间复杂度上,我们可以知道,快速排序的平均时间复杂度 : nlogn。而归并排序的时间复杂度 : nlogn。