#include<iostream>
//对数组a,下标范围在半开区间[ns,ne)的元素进行归并排序
using namespace std;
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,94,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]<<" ";
}
void MergeSort(int*a,int ns,int ne)
{
if(ne-ns==1)//1.递归终止条件,因为这是半开区间,所以只有一个元素
return;
//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,i;//左边子数组和右边子数组的下标;
int nt=0;//临时数组的下标;
for(i;;i++){
if(nl>=m||nr>=ne)break;//结束标志
if(a[nl]<=a[nr])//左边小,取左边元素
{ ta[nt]=a[nl];
nl++;//左半部分下标右移
nt++; //临时数组的下标也同时右移
}
else
{ ta[nt]=a[nr];
nr++;
nt++;
}
}
//2左,3右边谁未取完,放入临时数组
while(nl<m)
ta[nt++]=a[nl++];
while(nr<ne)
ta[nt++]=a[nr++];
//4.临时数组赋值给数组a
for(int i=0;i<ne-ns;i++)
a[ns+i]=ta[i];
//5.释放临时空间
delete[] ta;
}