自底向上的合并排序
来源:互联网 发布:阿里云服务器用户名 编辑:程序博客网 时间:2024/06/10 07:56
转自: http://blog.csdn.net/cjf_iceking/article/details/7920153
一. 算法描述
自底向上的归并排序:归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列;自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然后再将合并后的N/2(或者N/2 + 1)个子序列继续进行两两合并,以此类推得到一个完整的有序数组。下图详细的分解了自底向上的合并算法的实现过程:
二. 算法分析
平均时间复杂度: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];
- }
- /********************************************************
- *函数名称:BottomUpMergeSort
- *参数说明:pDataArray 无序数组;
- * iDataNum为无序数据个数
- *说明: 自底向上的归并排序
- *********************************************************/
- void BottomUpMergeSort(int* pDataArray, int iDataNum)
- {
- int *pTempArray = (int *)malloc(sizeof(int) * iDataNum); //临时存放合并后的序列
- int length = 1; //初始有序子序列长度为1
- while (length < iDataNum)
- {
- int i = 0;
- for (; i + 2*length < iDataNum; i += 2*length)
- Merge(pDataArray, pTempArray, i, i + length, i + 2*length);
- if (i + length < iDataNum)
- Merge(pDataArray, pTempArray, i, i + length, iDataNum);
- length *= 2; //有序子序列长度*2
- }
- free(pTempArray);
- }
0 0
- 自底向上的合并排序
- 合并排序的非递归实现(自底向上设计)
- 自底向上的归并排序
- 自底向上的归并排序
- 自底向上的归并排序
- 自底向上的归并排序算法
- 自底向上归并排序
- 归并排序的自底向上改进-使用插入排序
- 链表的自底向上归并排序
- 图示经典算法--自底向上的归并排序
- 算法之自底向上的归并排序
- 3-4 自底向上的归并排序算法
- 自顶向下的归并排序和自底向上的归并排序
- 自底向上排序法-c#
- 自底向上实现堆排序
- 非递归 自底向上归并排序
- 归并排序-自底向上(java实现)
- 自底向上的归并排序-转自算法C语言实现
- mysql sequence
- Java初学者都必须理解的六大问题
- 用命令行方式关闭CentOS防火墙
- clang_complete vim 简单配置
- jquery如何判断checkbox(复选框)是否被选中
- 自底向上的合并排序
- cocos2dx场景切换内存问题
- 软件测试之黑盒测试常用方法汇总
- hiho一下 第五周 Hihocoder #1037 : 数字三角形
- Qt修改键盘事件
- SDK中通用的一些概念.
- 语音群呼培训招生好办法
- IOS贝塞尔曲线绘图
- ios 仿射变换(齐次坐标原理)三维透视投影