归并排序

题目描述

将读入的 N 个数从小到大排序后输出。

输入格式

第一行为一个正整数 ​N​。

第二行包含 N 个空格隔开的正整数 ai​​,为你需要进行排序的数。

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

5
4 2 4 5 1
1 2 4 4 5

提示

对于 20% 的数据,有 ​1​≤​N​≤10​3​;

对于 100% 的数据,有 ​1​≤​N​≤​1****5​,​1​≤​a​[i]​​≤​1****9​。

要求

请用归并排序算法完成此题。

模板

#include <iostream>
using namespace std;

int a[100000005], tmp[10000005];

void ms(int q[], int l, int r)
{
    if (l >= r) return;
    int mid = l + r >> 1;
    ms(q, l, mid), ms(q, mid + 1, r);
    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++];
    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    ms(a, 0, n - 1);
    for (int i = 0; i < n; i++) cout << a[i] << " ";

    return 0;
}