算法学习笔记(五)------归并排序(分治)
2018-03-09 23:18
253 查看
归并排序有两个过程———分治与合并。
分治法(Divide and Conquer)是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
合并逻辑并不难理解,只是分治的逻辑会有一些麻烦,麻烦不是在于分治思想的难度,而是分治过程的逻辑代码不好编写。
其实对于我这种弱鸡,分治归并更像是一个分组合并的过程——-开始就有很多组,然后慢慢合并,在合并的过程中分组减少了,合并后的有序数组变大了,直至只有一个数组为止。
这也是为什么,有人管分治叫特殊的递归,也是为什么算法书里面两者经常出现在一起。
装有1 6个硬币的袋子。1 6个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。我们要找出这个伪造的硬币。我们有一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同.
分治法(Divide and Conquer)是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
合并逻辑并不难理解,只是分治的逻辑会有一些麻烦,麻烦不是在于分治思想的难度,而是分治过程的逻辑代码不好编写。
其实对于我这种弱鸡,分治归并更像是一个分组合并的过程——-开始就有很多组,然后慢慢合并,在合并的过程中分组减少了,合并后的有序数组变大了,直至只有一个数组为止。
这也是为什么,有人管分治叫特殊的递归,也是为什么算法书里面两者经常出现在一起。
装有1 6个硬币的袋子。1 6个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。我们要找出这个伪造的硬币。我们有一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同.
#include <iostream> using namespace std; void Merge(int a[],int s,int m,int e,int tmp[]) { //将数组a的局部a【s,m】和a【m+1,e】合并到tmp并保证tmp有序,然后再拷贝回a【s,m】 //归并操作的时间复杂度 O(e-m+1)即O(n) int pb = 0; int p1 = s , p2 = m+1; while (p1 <= m && p2<=e){ if(a[p1]<a[p2]) tmp[pb++] = a[p1++]; else tmp[pb++] = a[p2++]; } while (p1 < m) tmp[pb++] = a[p1++]; while (p2 <= e) tmp[pb++] = a[p2++]; for(int i = 0;i<e-s+1;++i) a[s+i] = tmp[i]; } void MergeSort(int a[],int s,int e,int tmp[]) { if(s<e){ int m = s+(e-s)/2; MergeSort(a,s,m,tmp); MergeSort(a,m+1,e,tmp); Merge(a,s,m,e,tmp); } } int main(){ int a[10]={13,25,19,2,8,12,2,8,30,89}; int b[10]; int size = sizeof(a)/sizeof(int); MergeSort(a,0,size-1,b); for(int i=0;i<size;++i) cout<<a[i]<<","; cout<<endl; return 0; }
相关文章推荐
- 算法学习之路:分治策略-归并排序-java实现
- 算法学习笔记--归并排序
- 数据结构&算法学习笔记: 归并排序
- 算法设计技巧和分析学习笔记1 (归纳法、分治和动态规划)
- 算法(第四版)学习笔记之归并排序的优化
- 算法(第四版)学习笔记之java实现归并排序
- [算法学习笔记]分而治之——归并排序
- 《数据结构与算法——C语言实现》学习笔记——归并排序
- 基础算法学习笔记—归并排序
- 算法导论学习笔记(2)-归并排序
- 【算法学习】归并排序——基于分治思想
- 【算法学习笔记】20.算法设计初步 归并排序 求逆序数
- 【算法学习笔记】20.算法设计初步 归并排序 求逆序数
- 算法学习笔记:Bellman-Ford算法 单源最短路
- 『算法学习笔记』13-15th day. 10道习题
- [算法学习笔记]冒泡排序和选择排序
- 《C++ Primer》第10章:泛型算法 学习笔记总结
- 数据结构学习笔记一:简单排序与查询算法
- 算法学习笔记之递推算法
- 算法设计和复杂性理论学习笔记_1(基本概念)