归并排序的思想是,
1.把一个数组分成两个部分
2.把这两个数组相对应位置的元素一起比较,小的先存入临时数组temp[](利用merge()函数)
3.若这两个数组中元素个数不相等,即一个数组中的元素多于另一个,则待个数少的数组的元素全部放完后,把元素多的数组的剩余元素按顺序全部放入temp[]中
4.用mergesort函数把刚才操作的数组分成左右两部分,重复1、2、3步的操作
注意:每次调用merge()后,都要把temp[]中的元素赋给a[]的相应部分(这样才能在上一次的基础上再进行比较),而且在吧temp[]中元素的值赋给a[]时,范围从start到end就可以了,因为每次在merge()中参与重新排序的就是start到end之间的这段范围。
具体实现为:
for(i=start;i<=end;i++)
a[i]=temp[i];
#include <iostream>
using namespace std;
int n;
int a[10000],temp[10000];
void merge(int start,int mid,int end)
{
int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end) //排序
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=mid)
temp[k++]=a[i++];
while(j<=end)
temp[k++]=a[j++];
}
void mergesort(int start,int end)
{
if(start<end)
{
int i,mid;
mid=(start+end)/2;
mergesort(start,mid); //再次划分数组
mergesort(mid+1,end);
merge(start,mid,end); //本次排序
for(i=start;i<=end;i++)
a[i]=temp[i];
}
}
int main()
{
int i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
mergesort(0,n-1);
for(i=0;i<n;i++)
cout<<temp[i]<<endl;
return 0;
}