2-路归并排序
来源:互联网 发布:2017mac国服英雄联盟 编辑:程序博客网 时间:2024/05/17 04:42
假设初始序列含有n个记录,则可看成是n个有序子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。
2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。
#include <iostream> using namespace std; #include<list> #define M 21 typedef int SqList[M]; void Merge(SqList &L,int left,int mid,int right) //2-路归并排序 { SqList L1; //定义一个新数组 int i = left, j = mid+1, p = 0; //分成两部分 while(i <= mid && j <= right) //两部分序列开始比较 { if(L[i] <= L[j]) //排序 { L1[p++] = L[i++]; //插入到新的空间内 } else { L1[p++] = L[j++]; } } while(i <= mid) //左半部分序列多 { L1[p++] = L[i++]; } while(j <= right) //右半部分序列多 { L1[p++] = L[j++]; } for(p = 0,i = left;i <= right;++p,++i) //重新拷贝到原数组中 { L[i] = L1[p]; } } void MSort(SqList &L,int left,int right) { if(left >= right) //长度小于等于1 { return; } else { int mid = (left+right)/2; //中值 MSort(L,left,mid); //左排序 MSort(L,mid+1,right); //右排序 Merge(L,left,mid,right); //归并 } } void main() { SqList sq = {49,38,65,97,76,13,27}; for(int i = 0;i < 7; ++i) { cout<<sq[i]<<" "; } cout<<endl; MSort(sq,0,6); for(i = 0;i < 7; ++i) { cout<<sq[i]<<" "; } cout<<endl; }
0 0
- 归并排序(2-路归并排序)
- 2路归并排序
- 2-路归并排序
- 2-路归并排序
- 归并排序(2-路)
- 2路归并排序
- 10.归并排序——2路归并排序
- java实现排序算法之归并排序(2路归并)
- 囧...2路归并排序..
- 归并排序(2路)
- 2-路归并排序算法
- 2路归并排序算法
- 2-路归并排序详解
- 排序 - 归并排序 [2]
- 归并排序:二路归并
- 归并排序--二路归并
- 归并排序、二路归并排序
- 数据结构——2路归并排序
- 求二叉树深度(递归方式)
- Log4j 2用法
- 10 个你需要了解的 Linux 网络和监控命令
- swift入门第二章运算符、字符串
- Ajax 完整教程
- 2-路归并排序
- HihoCoder 挑战赛12 C #1179 : 永恒游戏(枚举)
- COPY Linux与JVM的内存关系分析
- IOS-NSDate之今天,昨天,这周,这个月,上个月
- hdu 2948 Geometry Darts(math)
- 常见排序算法--实现(归类)
- 堆排序 Java
- 循环
- 二叉树的递归算法