合并排序,思想很简单,先分再合,这种算法不仔细看,很容易以为是快速排序。实际上相差很大。合并排序,每次分,都是取中间的一个位置,然后用递归,将一组T个数据分成T组一个数据的数组,然后再合并起来。(都是根据数组的下标进行运算,所以从0开始)
///合并排序
#include<iostream>
using namespace std;
void m_sort(int *arr,int begin,int middle,int end)
{
int M,N;
int i,j;
int *left,*right;
M=middle+1-begin;
N=end-middle;
left=new int[M];
right=new int[N];
memset(left,0,M*4);
memset(right,0,N*4);
for(i=0;i<M;++i)
left[i]=arr[begin+i];
for(i=0;i<N;++i)
right[i]=arr[middle+i+1];
i=j=0 ;
int t=begin;
while(i<M&&j<N)
{
if(left[i]<right[j])
arr[t++]=left[i++];
else
arr[t++]=right[j++];
}
while(i<M)
arr[t++]=left[i++];
while(j<N)
arr[t++]=right[j++];
delete left;
delete right;
}
void Merge(int *arr,int begin,int end)
{
int middle;
if(begin<end)
{
middle=(begin+end)/2;
Merge(arr,begin,middle);
Merge(arr,middle+1,end);
m_sort(arr,begin,middle,end);
}
}
int main()
{
int T=0;
int *arr;
while(cin>>T,T)
{
arr=new int[T];
cout<<"please input "<<T<<"numbers: ";
for(int i=0;i<T;++i)
cin>>arr[i];
Merge(arr,0,T-1);
for(int i=0;i<T;++i)
cout<<arr[i]<<" ";
cout<<endl;
delete arr;
}
return 0;
}
图:
![](https://img-my.csdn.net/uploads/201207/24/1343091948_1281.jpg)