4.归并排序
#include <iostream>
#include <cstdio>
using namespace std;
const int Maxm = 1000 + 2;
const int Maxn = 0xfffffff;
int n[Maxm];
int merge (int s , int r, int t)
{
if(s == t) return 0;
merge(s, (s + r) / 2, r);
merge(r + 1, (r + t + 1) / 2, t);
int a[Maxm], b[Maxm];
for(int i = s; i <= r; i++)
a[i] = n[i];
for(int i = r + 1; i <= t; i++)
b[i] = n[i];
a[r + 1] = b[t + 1] = Maxn;
int j = s, k = r + 1;
for(int i = 1; i <= t - s + 1; i++)
if(a[j] <= b[k]) n[s + i - 1] = a[j++];
else n[s + i - 1] = b[k++];
return 0;
}
int main()
{
int s = 1, t;
scanf("%d", &t);
for(int i = 1; i <= t; i++)
scanf("%d", &n[i]);
merge(s, (s+ t) / 2, t);
for(int i = 1; i <= t; i++)
printf("%d ", n[i]);
printf("\n");
return 0;
} //分治思想, 时间复杂度O(nlogn)
递归的初级应用,可类比到线段树的建树过程,一个比较简略版本的代码不知被我扔哪去了,见到后再补充(((φ(◎ロ◎;)φ)))