描述
利用二分归并排序算法将读入的N个数从小到大排序后输出。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
输入样例 1
10
2 8 4 6 1 10 7 3 5 9
输出样例 1
1 2 3 4 5 6 7 8 9 10
这题主要是二分归并排序,即把数组一分再分,每次都从中间分。然后再分到最后再进行一组一组的排序一段一段的拼接最后排序完成。
#include <iostream>
using namespace std;
int temp[100000];
int a[100000];
void MergeSort(int low,int mid,int high)
{
int i=low; //前半段
int j=mid+1; //后半段
int k=low; //辅助函数的位置
while(i<=mid&&j<=high)//这一步结束之后并不是所有的数据都填入了辅助数组
{
//如 前:1 3 后2 4 这个时候其实只有 1 2 3填入了辅助数组
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
//填入剩余的数据(后面两个while)
while(i<=mid)
temp[k++]=a[i++];
while(j<=high)
temp[k++]=a[j++];
//将数据填入原
for(k=low; k<=high; k++)
{
a[k]=temp[k];
}
}
void Merge(int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
Merge(low,mid);//从中间往前拆
Merge(mid+1,high);//从中间往后拆
MergeSort(low,mid,high);//排序回归
}
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0; i<n; i++)
cin>>a[i];
Merge(0,n-1);
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}