The Divide and Conquer Approach - 归并排序
- The divide and conquer approach - 归并排序
- 归并排序所应用的理论思想叫做分治法.
- 分治法的思想是: 将问题分解为若干个规模较小,并且类似于原问题的子问题,
- 然后递归(recursive) 求解这些子问题, 最后再合并这些子问题的解以求得
- 原问题的解.
- 即, 分解 -> 解决 -> 合并.
- The divide and conquer approach
- 分解: 将待排序的含有 n 个元素的的序列分解成两个具有 n/2 的两个子序列.
- 解决: 使用归并排序递归地排序两个子序列.
- 合并: 合并两个已排序的子序列得出结果.
- 归并排序算法的 '时间复杂度' 是 nlogn
- import time, random
- def sortDivide(alist): # 分解 divide
- if len(alist) <= 1:
- return alist
- l1 = sortDivide(alist[:alist.__len__()//2])
- l2 = sortDivide(alist[alist.__len__()//2:])
- return sortMerge(l1,l2)
- def sortMerge(l1, l2): # 解决 & 合并 sort & merge
- listS = []
- print("Left - ", l1)
- print("Right - ", l2)
- i,j = 0,0
- while i < l1.__len__() and j < l2.__len__():
- if l1[i] <= l2[j]:
- listS.append(l1[i])
- i += 1
- print("-i", i)
- else:
- listS.append(l2[j])
- j += 1
- print("-j", j)
- print(listS)
- else:
- if i == l1.__len__():
- listS.extend(l2[j:])
- else:
- listS.extend(l1[i:])
- print(listS)
- print("Product -",listS)
- return listS
- def randomList(n,r):
- F = 0
- rlist = []
- while F < n:
- F += 1
- rlist.append(random.randrange(0,r))
- return rlist
- if __name__ == "__main__":
- alist = randomList(9,100)
- print("List-O",alist)
- startT =time.time()
- print("List-S", sortDivide(alist))
- endT = time.time()
- print("Time elapsed :", endT - startT)
- output,
- List-O [88, 79, 52, 78, 0, 43, 21, 55, 62]
- Left - [88]
- Right - [79]
- -j 1
- [79]
- [79, 88]
- Product - [79, 88]
- Left - [52]
- Right - [78]
- -i 1
- [52]
- [52, 78]
- Product - [52, 78]
- Left - [79, 88]
- Right - [52, 78]
- -j 1
- [52]
- -j 2
- [52, 78]
- [52, 78, 79, 88]
- Product - [52, 78, 79, 88]
- Left - [0]
- Right - [43]
- -i 1
- [0]
- [0, 43]
- Product - [0, 43]
- Left - [55]
- Right - [62]
- -i 1
- [55]
- [55, 62]
- Product - [55, 62]
- Left - [21]
- Right - [55, 62]
- -i 1
- [21]
- [21, 55, 62]
- Product - [21, 55, 62]
- Left - [0, 43]
- Right - [21, 55, 62]
- -i 1
- [0]
- -j 1
- [0, 21]
- -i 2
- [0, 21, 43]
- [0, 21, 43, 55, 62]
- Product - [0, 21, 43, 55, 62]
- Left - [52, 78, 79, 88]
- Right - [0, 21, 43, 55, 62]
- -j 1
- [0]
- -j 2
- [0, 21]
- -j 3
- [0, 21, 43]
- -i 1
- [0, 21, 43, 52]
- -j 4
- [0, 21, 43, 52, 55]
- -j 5
- [0, 21, 43, 52, 55, 62]
- [0, 21, 43, 52, 55, 62, 78, 79, 88]
- Product - [0, 21, 43, 52, 55, 62, 78, 79, 88]
- List-S [0, 21, 43, 52, 55, 62, 78, 79, 88]
- Time elapsed : 0.0010027885437011719
The Divide and Conquer Approach - 归并排序的更多相关文章
- 【LeetCode】分治法 divide and conquer (共17题)
链接:https://leetcode.com/tag/divide-and-conquer/ [4]Median of Two Sorted Arrays [23]Merge k Sorted Li ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 算法上机题目mergesort,priority queue,Quicksort,divide and conquer
1.Implement exercise 2.3-7. 2. Implement priority queue. 3. Implement Quicksort and answer the follo ...
- [LeetCode] 236. Lowest Common Ancestor of a Binary Tree_ Medium tag: DFS, Divide and conquer
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- [LeetCode] 系统刷题4_Binary Tree & Divide and Conquer
参考[LeetCode] questions conlusion_InOrder, PreOrder, PostOrder traversal 可以对binary tree进行遍历. 此处说明Divi ...
- [LeetCode] 124. Binary Tree Maximum Path Sum_ Hard tag: DFS recursive, Divide and conquer
Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any ...
- 分治法 - Divide and Conquer
在计算机科学中,分治法是一种很重要的算法.分治法即『分而治之』,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的 ...
- [算法]分治算法(Divide and Conquer)
转载请注明:http://www.cnblogs.com/StartoverX/p/4575744.html 分治算法 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是 ...
- Divide and Conquer.(Merge Sort) by sixleaves
algo-C1-Introductionhtml, body {overflow-x: initial !important;}html { font-size: 14px; }body { marg ...
随机推荐
- echarts更改坐标轴文字颜色及大小
xAxis: { data: anameArr, axisLabel: { show: true, textStyle: { color: '#c3dbff', //更改坐标轴文字颜色 fontSiz ...
- 怎么将文件夹上传到GitHub上
1. 在GitHub上新建一个仓库地址: http://github.com/......git 2. 在需要上传的文件夹目录下,运行 git init 初始化git: 3. 运行git ad ...
- 256位AES加密和解密
/// <summary> /// 256位AES加密 /// </summary> /// <param name="toEncrypt">& ...
- crawler 听课笔记 碎碎念 2 一些爬虫须知的基本常识和流程
html的宗旨: <标签 属性=”属性的值“></标签> 只是对于文本的一种解释划分吧 dom的宗旨: 就是一个大数组,处理方便,效率低 xm ...
- Activiti 规则任务(businessRuleTask)
Activiti 规则任务(businessRuleTask) 作者:Jesai 目前国内研究Activiti规则任务businessRuleTask)的文章在网上应该不超出3篇 小觑夜漫酒作伴,破晓 ...
- 2019CSP复赛游记
Day 0 作为一个初三的小蒟蒻…… 什么算法都不会打…… 做一道LCA+生成树的图论题调了两个小时…… 明日裸考…… Day 1 Morning 买了两个士力架,带了一盒牛奶,准备在考场上食用(这个 ...
- hge引擎使用技巧
图片周围最好留出一像素,即上下左右都多出一像素.然后使用pngopt.exe处理一下.这样可以减少图片拉伸.旋转时边界模糊的情况 图片宽高最好是 2的N次方
- Python3 正则表达式 re 模块的使用 - 学习笔记
re 模块的引入 re 模块的使用 re.compile() re.match()与re.search() re.match re.search() 区别 re.findall()与re.findit ...
- MyBatis-Plus学习笔记(1):环境搭建以及基本的CRUD操作
MyBatis-Plus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,使用MyBatis-Plus时,不会影响原来Mybatis方式的使用. SpringBoot+M ...
- php--->单例模式封装mysql操作类
php 单例模式封装mysql操作类 单例模式的必要条件(三私一公) 私有的成员属性--防止类外引入这个存放对象的属性 私有的构造方法--为了防止在类外使用new关键字实例化对象 私有的克隆方法--为 ...