归并排序算法
2015-08-07 16:26
471 查看
使用数组结构,自顶向下算法。
//将分治的两端按大小次序填入临时数组,最后把临时数组拷贝到原始数组中 //lPos到rPos-1为一端,rPos到rEnd为另一端 void Merge(int a[], int tmp[], int lPos, int rPos, int rEnd) { int i, lEnd, NumElements, tmpPos; lEnd = rPos - 1; tmpPos = lPos; //从左端开始 NumElements = rEnd - lPos + 1; //数组长度 While(lPos <= lEnd && rPos <= rEnd) { if(a[lPos] <= a[rPos]) //比较两端的元素值 tmp[tmpPos++] = a[lPos++]; //把较小的值放在tmp临时数组 else tmp[tmpPos++] = a[rPos++]; } //到这里,左端或者右端只能有一端还可能含有剩余元素 while(lPos <= lEnd) //把左端剩余的元素放入tmp tmp[tmpPos++] = a[lPos++]; while(rPos <= rEnd) //把右端剩余的元素放入tmp tmp[tmpPos++] = a[rPos++]; for(i = 0; i < NumElements; i++, rEnd--) a[rEnd] = tmp[rEnd]; //把临时数组拷贝到原始数组 } void msort(int a[], int tmp[], int low, int high) { if(low >= high) //结束条件,原子结点return return; int middle = (low + high)/2; //计算分裂点 msort(a, tmp, low, middle); //对子区间[low, middle]递归做归并排序 msort(a, tmp, middle + 1; high);//对子区间[middle + 1, high]递归做归并排序 Merge(a, tmp, low, middle + 1, high); //组合,把两个有序区间合并为一个有序区 } void merge_sort(int a[], int len) { int* tmp = NULL; tmp = new int[len]; //分配临时数组 if(tmp != NULL) { msort(a, tmp, 0, len - 1); //调用msort归并排序 delete []tmp; //释放临时数组内存 } }
相关文章推荐
- iOS 代码规范
- nyoj 329 【KMP】
- 树结构练习——排序二叉树的中序遍历
- Android TextView字体颜色等样式详解
- XSHELL下直接下载文件到本地(Windows)
- DKMS简介
- 最长递增子序列的长度
- 无废话WCF入门教程一
- Tomcat web.xml Can't convert argument: null错误解决办法
- KMP精讲
- codility minAveTwoSlice
- hdu5353||2015多校联合第六场1001 贪心
- PAT 1013. Battle Over Cities (25)
- HDU 1242 Rescue
- 高频热点账户如何解决高并发余额计数问题?
- [转]hadoop2.x常用端口
- JS 变量或参数是否有值的判断
- POJ1423————Big Number
- android学习中
- windows下memcached的安装与使用