十大基础排序 · 七 --- 2-路归并(稳定)
来源:互联网 发布:怎么安装发票软件 编辑:程序博客网 时间:2024/04/29 01:14
1. 分析
/*7. 2路-归并排序(MergeSort)#时间复杂度: O(nlogn);空间复杂度:O(n)//实现归并排序需和待排记录等数量的辅助空间;#分析: 1. 先分解左边,再分解右边 2. 左右两个分解完毕,直到小组仅有一个元素,返回 3. 返回上一级调用处(此时小组中是有2个元素的) 4. 执行Merge#特点: 稳定#实现方法:递归*/
2. 源码
void Merge(int arr[], int nLow, int nHigh){ int nStart1; int nEnd1; int nStart2; int nEnd2; int i; int *pTemp = NULL; pTemp = (int*)malloc(sizeof(int) * (nHigh - nLow +1)); //1. 分成2块再合并; nStart1 = nLow; nEnd1 = (nLow + nHigh) /2; nStart2 = nEnd1 +1; nEnd2 = nHigh; i = 0; while(nStart1 <= nEnd1 && nStart2 <= nEnd2) { if(arr[nStart1] < arr[nStart2]) { pTemp[i] = arr[nStart1]; nStart1++; } else { pTemp[i] = arr[nStart2]; nStart2++; } i++; } //谁没结束,继续放谁 while(nStart1 <= nEnd1) { pTemp[i++] = arr[nStart1]; nStart1++; } while(nStart2 <= nEnd2) { pTemp[i++] = arr[nStart2]; nStart2++; } //将合并后的数据拷贝到原数组中 for(i=0; i< nHigh-nLow+1;i++) { //注意此处 arr 的下标处理 arr[i + nLow] = pTemp[i]; } free(pTemp); pTemp = NULL; return ;}void MergeSort(int arr[], int nLow, int nHigh){ //2.左右两个分解完毕,直到小组仅有一个元素,返回 if(arr == NULL ||nLow >= nHigh) return ; //1.先分解左边,再分解右边 int nMid = (nLow + nHigh)/2; MergeSort(arr,nLow, nMid); MergeSort(arr,nMid+1, nHigh); //3. 上述递归分解完毕,返回到这里继续执行; Merge(arr, nLow, nHigh);}
阅读全文
0 0
- 十大基础排序 · 七 --- 2-路归并(稳定)
- 十大基础排序 · 十 --- 基数排序(稳定)
- 十大基础排序 · 三 --- 冒泡排序(稳定 ,常规写法)
- 十大基础排序 · 一 --- 直接插入排序(稳定)
- java 归并排序(稳定)
- 十大基础实用算法补全——归并排序(MergeSort)
- 排序算法(七) 2路归并排序
- 经典排序算法----归并排序(稳定)
- 稳定排序:归并排序
- 十大基础排序 · 九 --- 桶排序(不稳定)
- 十大基础排序 · 六 --- 堆排序(不稳定)
- 十大基础排序 · 五 --- 选择排序(不稳定)
- 十大基础排序 · 二 --- 希尔排序(不稳定)
- 排序专题(三) / 稳定的内部排序 / 递归的2-路归并排序
- 十大基础实用算法之归并排序和二分查找
- poj1007 稳定排序 归并排序
- 稳定排序之归并排序
- 详解“十大排序技术”(一):插入排序与归并排序
- 第11节-Linux EXT2/EXT3 文件的存取与日志式文件系统的功能
- sigmoid函数的求导
- 深搜
- C语言星号'*'意思,取值作用分析
- scrapy爬虫学习
- 十大基础排序 · 七 --- 2-路归并(稳定)
- git提示error setting certificate verify locations解决办法
- 在使用junit进行功能测试的时候,遇到SpringJUnit4ClassRunner requires JUnit4.12 or higher
- Fedora上安装搜狗输入法
- BZOJ 3931 最大流
- caffe 新层
- 注意DotNet的ConnectionLimit
- 中国剩余定理(不互质的情况)-HDU3579
- MySQL错误代码大全