转自: http://blog.csdn.net/cjf_iceking/article/details/7921443
一. 算法描述
自顶向下的归并排序:采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解、求解、合并。
(1)先将长度为N的无序序列分割平均分割为两段
(2)然后分别对前半段进行归并排序、后半段进行归并排序
(3)最后再将排序好的前半段和后半段归并
过程(2)中进行递归求解,最终下图详细的分解了自顶向下的合并算法的实现过程:
二. 算法分析
平均时间复杂度:O(nlog2n)
空间复杂度:O(n) (用于存储有序子序列合并后有序序列)
稳定性:稳定
三. 算法实现
- /********************************************************
- *函数名称:Merge
- *参数说明:pDataArray 无序数组;
- * int *pTempArray 临时存储合并后的序列
- * bIndex 需要合并的序列1的起始位置
- * mIndex 需要合并的序列1的结束位置
- 并且作为序列2的起始位置
- * eIndex 需要合并的序列2的结束位置
- *说明: 将数组中连续的两个子序列合并为一个有序序列
- *********************************************************/
- void Merge(int* pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)
- {
- int mLength = eIndex - bIndex; //合并后的序列长度
- int i = 0; //记录合并后序列插入数据的偏移
- int j = bIndex; //记录子序列1插入数据的偏移
- int k = mIndex; //记录子序列2掺入数据的偏移
- while (j < mIndex && k < eIndex)
- {
- if (pDataArray[j] <= pDataArray[k])
- {
- pTempArray[i++] = pDataArray[j];
- j++;
- }
- else
- {
- pTempArray[i++] = pDataArray[k];
- k++;
- }
- }
- if (j == mIndex) //说明序列1已经插入完毕
- while (k < eIndex)
- pTempArray[i++] = pDataArray[k++];
- else //说明序列2已经插入完毕
- while (j < mIndex)
- pTempArray[i++] = pDataArray[j++];
- for (i = 0; i < mLength; i++) //将合并后序列重新放入pDataArray
- pDataArray[bIndex + i] = pTempArray[i];
- }
- /********************************************************
- *函数名称:RecursionMergeSort
- *参数说明:pDataArray 无序数组;
- * int *pTempArray 临时存放合并的序列
- * iBegin为pDataArray需要归并排序的起始位置
- * iEnd为pDataArray需要归并排序的结束位置
- *说明: 自顶向下的归并排序递归函数
- *********************************************************/
- void RecursionMergeSort(int* pDataArray, int *pTempArray, int iBegin, int iEnd)
- {
- if (iBegin < iEnd)
- {
- int middle = (iBegin + iEnd) / 2;
- RecursionMergeSort(pDataArray, pTempArray, iBegin, middle); //前半段递归归并排序
- RecursionMergeSort(pDataArray, pTempArray, middle + 1, iEnd); //后半段归并排序
- Merge(pDataArray, pTempArray, iBegin, middle + 1, iEnd + 1); //合并前半段和后半段
- }
- }
- /********************************************************
- *函数名称:UpBottomMergeSort
- *参数说明:pDataArray 无序数组;
- * iDataNum为无序数据个数
- *说明: 自顶向下的归并排序
- *********************************************************/
- void UpBottomMergeSort(int* pDataArray, int iDataNum)
- {
- int *pTempArray = (int *)malloc(sizeof(int) * iDataNum); //临时存放合并后的序列
- RecursionMergeSort(pDataArray, pTempArray, 0, iDataNum - 1);
- free(pTempArray);
- }