**
归并排序
**
#include <bits/stdc++.h>
#define MAX 100005
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int nArr[MAX];//存放原数据
int nTemp[MAX];//临时保存数据
int nNum;//数据的多少
//对从[Left - Mid] 和 [Mid+1 Right]的数据进行排序
void MergeSort(int nLeft, int nMid, int nRight)
{
int i = nLeft;
int j = nMid+1;
int nLen = 0;
//对两个区间进行比较 小的拷贝进入临时数组
while((i <= nMid) && (j <= nRight))
{
if(nArr[i] < nArr[j])
{
nTemp[nLen++] = nArr[i];
i++;
}
else
{
nTemp[nLen++] = nArr[j];
j++;
}
}
//两个区间必定只有一个没有拷贝完成
while(i <= nMid)
{
nTemp[nLen++] = nArr[i];
i++;
}
while(j <= nRight)
{
nTemp[nLen++] = nArr[j];
j++;
}
//将排序好的有序数组 拷贝回原数组
//拷贝时 注意原数组的下标
for(int k = 0; k < nLen; k++)
{
nArr[nLeft+k] = nTemp[k];
}
}
void Merge(int nLeft, int nRight)
{
if(nLeft >= nRight)
{
return;
}
int nMid = (nRight - nLeft)/2 + nLeft;
//区间的划分
Merge(nLeft, nMid);
Merge(nMid + 1, nRight);
//合并两个区间
MergeSort(nLeft, nMid, nRight);
}
int main(int argc, char** argv)
{
scanf("%d",&nNum);
for(int i = 0; i < nNum; i++)
{
scanf("%d",&nArr[i]);
}
Merge(0, nNum-1);
for(int i = 0; i < nNum; i++)
{
printf("%d ",nArr[i]);
}
return 0;
}