归并排序:将两个或者两个以上的有序表合并成一个新的有序表,二路归并就是一组数组中前后相邻的两个有序序列归并为一个有序序列
二路归并的核心思想:假设有n个序列,然后两两归并,得到[n/2]个长度为2或者1的子序列;然后再两两归并,……,直至得到一个长度为n的有序序列为止
看下面2路归并算法的实例:
int MSort(MergeType S, MergeType *pT, int nStart, int nEnd)
{
int nMidPos = 0;
if ( !S.elem || nStart > nEnd)
{
return -1;
}
if (nStart == nEnd)
{
pT->elem[nStart] = S.elem[nStart];
return 0;
}
nMidPos = (nStart + nEnd) / 2;
MSort(S, pT, nStart, nMidPos);
MSort(S, pT, nMidPos + 1, nEnd);
Merge(S, pT, nStart, nMidPos, nEnd);
return 0;
}
上面的步骤是将数据对半分割,直至只有一个数据,然后再进行归并,这是个递归的操作,看一下如何进行归并操作:
/*S:原数据列表,pT:排序好的数据列表,其他数据和函数定义请参考:冒泡算法的改进*/
</