图解 图解来源
归并排序流程
合并流程
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 101000;
ll n,a[maxn],b[maxn];
void cc(int l,int r)
{
if(l>=r)
return;
int mid = (l + r) / 2;
cc(l, mid);
cc(mid + 1, r);
int i, u, v;
for (i = l, u = l, v = mid + 1; i <= r && u <= mid && v <= r; i++)
{
if(a[u]<a[v])
{
b[i] = a[u];
u++;
}
else
{
b[i] = a[v];
v++;
}
}
if(u<=mid)
{
for (int j = i; j <= r;j++)
b[j] = a[u++];
}
if(v<=r)
{
for (int j = i; j <= r;j++)
b[j] = a[v++];
}
for (int k = l; k <= r; k++)
a[k]=b[k];
return;
}
int main()
{
cin >> n;
for (int i = 1; i <= n;i++)
cin >> a[i];
cc(1,n);
for (int i = 1; i <= n;i++)
if(i<n)
cout << b[i] << " ";
else
cout << b[i] << endl;
return 0;
}