#归并排序:
-采用分治法*(divide-and-conquer)*
分治法将问题分(divide)成一些小的问题然后递归求解,
而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之
-递归+合并即为归并
归并的应用:求逆序对(只需在合并函数中稍加改动)
递归
void mergearray(int a[],int first,int mid,int last,int temp[])
{
int i=first,j=mid+1;
int n=mid,m=last;
int k=0;
while(i<=n&&j<=m)
{
if(a[i]<a[j]) temp[k++]=a[i++];
else temp[k++]=a[j++];
}
while(i<=n) temp[k++]=a[i++];
while(j<=m) temp[k++]=a[j++];
for(int ii=0;ii<k;ii++)
a[first+ii]=temp[ii];
}
void mergesort(int a[],int first,int last,int temp[])
{
int mid=(first+last)/2;
if(first < mid)
mergesort(a,first,mid,temp); //左边有序
if(mid+1 < last)
mergesort(a,mid+1,last,temp); //右边有序
mergearray(a,first,mid,last,temp); //合并
}