归并排序具体分成三个过程:
(1)分解:将当前区间一分为二,即求分裂点 mid = (low + high)/2;
(2)求解:递归地对两个子区间 array[low..mid] 和 array[mid + 1..high] 进行归并排序;递归的终结条件:子区间长度为 1(一个记录自然有序)。
(3)合并:将已排序的两个子区间R[low..mid]和R[mid + 1..high]归并为一个有序的区间 array[low..high]。
#include <iostream>
using namespace std;
void mergesides(int *a,int start,int middle,int last)
{
int *c=new int[last-start+1];
int i=start,j=middle+1;
int k=0;
while(i<=middle&&j<=last)
{
if(a[i]<=a[j])
c[k++]=a[i++];
else c[k++]=a[j++];
}
while(i<=middle)
c[k++]=a[i++];
while(j<=last)
c[k++]=a[j++];
for(k=0;k<=last-start;k++)
a[start+k]=c[k];
delete []c;
}
void mergesort(int *a,int start,int last)
{
if(start<last)
{
int middle=(start+last)/2;
mergesort(a,start,middle);
mergesort(a,middle+1,last);
mergesides(a,start,middle,last);
}
}
int main()
{
int a[9]={4,61,25,13,92,28,56,37,10};
mergesort(a,0,8);
for(int i=0;i<9;i++)
cout << a[i] << " ";
return 0;
}