归并排序

  • 算法板子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <cstdio>

using namespace std;
const int N = 1e8 + 9;

int a[N], tmp[N];

void merge_sort(int q[], int l, int r)
{
if(l >= r) return ;

int mid = l + r >> 1;

merge_sort(q, l, mid), merge_sort(q, mid + 1, r);

int k = 1, 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 = 1; i <= r;i ++, j ++) q[i] = tmp[j]; // 注意 j 从数组的起点开始
}

int main()
{
int n; scanf("%d", &n);
for(int i = 1;i <= n;i ++) scanf("%d", &a[i]);

merge_sort(a, 1, n);

for(int i = 1;i <= n;i ++) printf("%d", a[i]);
return 0;
}

-