【排序算法】-归并排序
2016-07-07 19:38
225 查看
不赘述,上代码。环境:VS2010 C++ Win10 64位
总结算法特点:算法略微复杂,采用分治策略,将排序数据递归分割为小段,每段排序后归并成整体排序。时间复杂度低,最坏情况和最好情况以及平均情况均是O(nlog(n))。空间开销大,由于递归和创建拷贝数组,空间开销非常大。根据测试,由于使用了递归,小规模数据量下算法时间并不比插入、冒泡等简单算法速度快,在数据量增大后优势明显,具体测试结果稍后单独写一篇文章集中进行对比分析。算法稳定。
void merge(int *data, int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int n = r - p+1; int *np1 = new int[n1]; int *np2 = new int[n2]; for (size_t i = 0; i < n1; i++) np1[i] = data[i + p]; for (size_t i = 0; i < n2; i++) np2[i] = data[i + q+1]; int p1 = 0,p2 = 0; for (size_t i = 0; i < n; i++) { if (p1<n1&&p2<n2) { if (np1[p1]<np2[p2]) { data[i+p] = np1[p1]; p1++; } else { data[i + p] = np2[p2]; p2++; } }else if (p1==n1) { for (; i < n; i++) data[i + p] = np2[p2++]; } else if (p2 == n2) { for (; i < n; i++) data[i + p] = np1[p1++]; } } delete[] np1; delete[] np2; } void mergeSort(int *data, int begin, int end) { if (begin<end) { int q = (int)(begin + end) / 2; mergeSort(data, begin, q); mergeSort(data, q + 1, end); merge(data, begin, q, end); } }
总结算法特点:算法略微复杂,采用分治策略,将排序数据递归分割为小段,每段排序后归并成整体排序。时间复杂度低,最坏情况和最好情况以及平均情况均是O(nlog(n))。空间开销大,由于递归和创建拷贝数组,空间开销非常大。根据测试,由于使用了递归,小规模数据量下算法时间并不比插入、冒泡等简单算法速度快,在数据量增大后优势明显,具体测试结果稍后单独写一篇文章集中进行对比分析。算法稳定。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- JavaScript演示排序算法
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析