merge函数将两列有序序列合成一列。
merge_sort 函数使用分治思想,递归求解。将对一个序列排序转换成对左右两个序列排序,一直到序列长度为一时,递归开始回升。再将左右两个已经排好序的序列合并。
//
// main.cpp
// merge_sort
//
// Created by Fangpin on 15/3/9.
// Copyright (c) 2015年 FangPin. All rights reserved.
//
#include <iostream>
#include <cstdio>
const int MAXN=1e10;
int a[20006],b[20005],c[20005];
void merge(int p,int q,int r){
int j=0;
for(int i=p;i<=q;++i) b[j++]=a[i];
b[j]=MAXN;j=0;
for(int i=q+1;i<=r;++i) c[j++]=a[i];
c[j]=MAXN;j=0;
int k=0;
for(int i=p;i<=r;++i){
if(b[j]<=c[k])
a[i]=b[j++];
else a[i]=c[k++];
}
}
void merge_sort(int l,int r){
if(l>=r) return;
int m=(l+r)>>1;
merge_sort(l,m);
merge_sort(m+1,r);
merge(l,m,r);
}
int main(int argc, const char * argv[]) {
// insert code here...
int n;
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
}
merge_sort(0,n-1);
for(int i=0;i<n;++i){
if(i) printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}