#include <iostream>
using namespace std;
//对数组a,下标范围在[ns,ne)的元素进行归并排序
void MergeSort(int*a,int ns,int ne);
void print(int*a,int n);
int main()
{
int a[]={4,1,10,15,37,79,24,11,91,2,18,9,45,21,52,83,98,90};
int n=sizeof(a)/sizeof(*a);
MergeSort(a,0,n);
print(a,n);
return 0;
}
void print(int *a,int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void MergeSort(int*a,int ns,int ne)
{
//1.递归终止条件
//半开区间中只有1个元素,这时一定有序
if(ne-ns==1)
return;
//2.二分法,取中间位置
//对2个子数组进行分开排序
int m=ns+(ne-ns)/2; //取中间位置
MergeSort(a,ns,m); //左半区间归并排序 [ns,m)
MergeSort(a,m,ne); //右半区间归并排序 [m,ne)
//3.合并
//1)依次取出子数组的元素,进行合并
int *ta=new int[ne-ns];//定义一个临时数组
int nl=ns,nr=m; //左半边的子数组和右边的子数组下标
int nt=0; //临时数组的下标
for(;;){
//左半区间[ns,m),右半区间[m,ne)
if(nl>=m || nr>=ne)
break;
if(a[nl]<=a[nr]){ //左边的小
ta[nt]=a[nl]; //取左边元素
nl++; //左半部下标右移
nt++; //临时数组的下标右移
}
else{ //右边的小
ta[nt]=a[nr]; //取右边元素
nr++; //右半部下标右移
nt++; //临时数组的下标右移
}
}
老师整理的代码,用来参考