归并排序中的基本操作是合并两个已排好序的表,如果把一个表中的每个元素单独看成一个“表”,那么每个表都是有序的,然后再挨着挨着把每个“表”进行按序合并,那么形成的一个新表也是有序的。归并的思想就是这样的,先递归操作把一个大表分成小表,在把每个小表进行并操作。
void MergeArray(int *a,int start,int mid,int end,int *temp) //合并操作 数组a[start...mind]和a[mind+1...end]进行合并
{
int i=start;
int j=mid+1;
int m=mid;
int n=end;
int k=0;
while(i<=m &&j<=n)
{
if(a[i]<=a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
}
}
while(i<=m)
{
temp[k++]=a[i++];
}
while(j<=n)
{
temp[k++]=a[j++];
}
for(i=0;i<k;i++)
{
a[start+i]=temp[i]; //将合并好的数组temp放到先前合并成功的数组a[0....start]中
}
}
void MergeSort(int *a,int start,int end,int *temp)
{
if(start<end)
{
int mid=(start+end)/2;
MergeSort(a,start,mid,temp); //分解表左半部分
MergeSort(a,mid+1,end,temp); //分解表右半部分
MergeArray(a,start,mid,end,temp); //并
}
}