归并排序算法
来源:互联网 发布:数据派发管理制度 编辑:程序博客网 时间:2024/06/06 09:11
归并排序算法
归并排序是一种典型的分治算法
- 分解:总是对排序区间内的元素以中点二分,分别对左右区间进行排序
- 解决:归并排序不断递归调用自己,分解到底层后,待排序区间缩减为2个元素的比较
- 合并:在递归分解的每一层上,都得到左右两边已经排序的子序列,需要将有序子序列合并到一个序列. 实质上 “解决”环节是在“合并”中一起完成的,因为分解到每组2个元素还可以继续分解成左右各1个元素,然后再逐层向上合并.
- 合并是本算法的难点,需要两个指示器来分别标识两个子序列进行当前排序的两个元素;此外本设计中在左右两个子序列后面增加了一个无穷大元素,以方便处理边界问题
代码实现
#include <iostream>#include <string>#include <vector>#include <cfloat>using namespace std;void merge(vector<double> & A, int p, int q, int r){ int nl = q-p+1; int nr = r-q; vector<double> al(nl+1), ar(nr+1); for( int i = 0; i<nl; ++i) { al[i] = A[p+i]; } for (int j = 0; j<nr; ++j) { ar[j] = A[q+1+j]; } al[nl] = DBL_MAX; ar[nr] = DBL_MAX; int i = 0; int j = 0; for (int k = p; k <= r; ++k) { if(al[i] <= ar[j]) { A[k] = al[i]; ++i; } else { A[k] = ar[j]; ++j; } }}void mergesort(vector<double> & A, int p, int r){ if (p<r) { int q = (p+r)/2; for (int i=0; i<A.size(); ++i) { cout<<A[i]<<" "; } cout<<endl; mergesort(A, p, q); mergesort(A, q+1, r); merge(A, p, q, r); }}int main(){ double arr[] = {10, 12, 5, 56, 28, 15, 68, 45, 98, 2, 73}; vector<double> A(arr, arr+11); for (int i=0; i<A.size(); ++i) { cout<<A[i]<<endl; } int p=0; int r=A.size()-1; mergesort(A, p, r); for (int i=0; i<A.size(); ++i) { cout<<A[i]<<endl; } return 0;}
复杂度分析
- 每次进行二分分解,长度为
n 的序列,最大层数为lg(n) . 每层之中要合并的总元素个数为n , 合并的复杂度为Θ(n) - 整个算法的时间复杂度为
Θ(nlg(n))
0 0
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- extjs5备忘(2)
- 使用porttunnel进行内外网端口映射
- leetcode Add Binary
- Linux VPS下SSH常用命令
- Bamboo的windows安装
- 归并排序算法
- 喜羊羊系列之进程与线程
- Android SQLite升级 数据迁移
- WebView 加载 html
- 双缓冲技术(C# GDI)
- 数组-02. 打印杨辉三角(20)
- ios浏览器里面数字被当做电话号码导致变色
- Soot中执行过程内数据流分析
- Nginx学习笔记——进程代码片段(一)