# 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。