输入n个数,将其排序;
5
1 3 6 4 2
输出:1 2 3 4 6
归并排序是把数组分成很多小段,将小段排序,再整合到大段里面,那几题怎么排序呢,创建一个数组 t ,将要排序的两小段对比,小的先放 t 数组里面,大的后放,再把原数组变成 t就可以了,代码中有详细注释
#include <iostream>
using namespace std;
void merger(int a[],int low,int mid,int high)
{
int l=low,r=mid+1;//分为左右两部分
int *t=new int[high-low+1],k=0;//创建一个数组将其排序
while(l<=mid&&r<=high){
if(a[l]<=a[r])t[k++]=a[l++];//先把小的存入t数组
else t[k++]=a[r++];
}
while(l<=mid)t[k++]=a[l++];//左边还有剩余
while(r<=high)t[k++]=a[r++];//右边还有剩余
for(int i=0,j=low;i<k;i++){//再排好序的t数组放回a中即可
a[j++]=t[i];
}
delete []t;//清除内存空间
}
void bingui(int a[],int low,int high)
{
if(low==high)return ;
else{
int mid=(low+high)/2;
bingui(a,low,mid);//要把数组先分成若干只有两个元素的部分
bingui(a,mid+1,high);
merger(a,low,mid,high);//分好之后才开始排序
}
}
int main()
{
int n,i,j,a[100005];
cin>>n;
for(i=0; i<n; i++)
{
cin>>a[i];
}
bingui(a,0,n-1);
for(i=0; i<n; i++)
{
cout<<a[i]<<" ";
}
return 0;
}