分治策略中有一个经典的算法就是合并排序,这个算法的精髓也是分治二字,分而治之。将一个大规模的问题切割成若干个相同的小问题。小问题的规模非常小,非常easy解决,攻克了小的问题后再对这些小问题的结果进行合并得到大规模问题的解答。
合并排序便是分治策略中比較经典的算法,首先是合并。两个排列有序的数列经过合并后成为有序的数组:代码例如以下:
void _merge(int *A,int left,int middle,int right)
{
int i=left,j=middle+1,k=0;
int *C;
C=new int[right-left+1];
while(i<middle+1 && j<right+1)
{
if(A[i]<A[j])
{
C[k++]=A[i++];
}
else
{
C[k++]=A[j++];
}
}
while(i<middle+1)
C[k++]=A[i++];
while(j<right+1)
C[k++]=A[j++];
for(int i=0;i<right-left+1;i++)
{
A[i+left]=C[i];
}
delete[] C;
}
上面的算法是将一个数组分成左右两个进行合并。假设这左右的两个数组都是排列有序的话,那么合成的新的数列也是有序的,以下的任务就是怎么将左右的两个数列排列成有序的,方法就是用递归思想。不断的递归,将数列不断的划分。划分成最小的单元,仅仅有一个数的时候。那么再进行合并,合并成的数列便是有序数列了,代码例如以下:
void _merge_sort(int *A,int left,int right)
{
if(left<right)
{
int middle=(left+right)/2;
_merge_sort(A,left,middle);
_merge_sort(A,middle+1,right);
_merge(A,left,middle,right);
}
}
最后进行測试:
void main()
{
int ib[]={2,3,1,0,9,1,3,5};
int length=sizeof(ib)/sizeof(int);
_merge_sort(ib,0,length-1);
for(int i=0;i<length;i++)
{
cout<<ib[i]<<' ';
}
}
结果例如以下: