划分问题:把序列分成元素个数尽量相等的两半
递归求解:把元素两半分别排序
合并问题:把两个有序表合并成一个。每次只需要把两个序列的最小元素加以比较,删除其中的较小元素并加入合并后的新表,我们需要一个附加空间t来进行新表的储存。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5000;
int a[N << 1],t[N << 1],n;
void merge_sort(int x, int y){
if(y - x > 1){
int mid = x + (y -x)/2;
int p = x, q = mid, i = x;
merge_sort(x, mid);
merge_sort(mid, y);
while(p < mid || q < y){///左右有一个非空就继续合并
if(q >= y || (p < mid && a[p] <= a[q]))///从左半数组复制到临时空间(右半数组为空,那么左半数组必不为空)
t[i++] = a[p++];
else
t[i++] = a[q++];
}
for(int i=x; i<y; i++) a[i] = t[i];
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d",&n) == 1){
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
merge_sort(1,n+1);
for(int i=1; i<=n; i++) printf("%d ",a[i]);
printf("\n");
}
return 0;
}