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 ...
随机推荐
- MongoDB Community 的安装和卸载
MongoDB在他们的仓库中提供官方支持的包,该仓库包括以下软件包 mongodb-org:自动安装下面的四个组件安装包 a.mongodb-org-server:mongod的守护进程和相关的配置以 ...
- 为WPF, UWP 及 Xamarin实现一个简单的消息组件
原文地址:Implementing a simple messenger component for WPF, UWP and Xamarin 欢迎大家关注我的公众号:程序员在新西兰了解新西兰IT行业 ...
- cogs 1001. [WZOI2011 S3] 消息传递 Tarjan
1001. [WZOI2011 S3] 消息传递 ★★ 输入文件:messagew.in 输出文件:messagew.out 简单对比时间限制:1 s 内存限制:128 MB Prob ...
- 解析Json字符串中的指定的值
{ "head": { ", "Id": "20191008144448iAQE", "Message": & ...
- Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦. 详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1) OC ...
- Jenkins Job构建
Jenkins job介绍 Jenkins Freestyle与Pipeline Job区别 Jenkins Job构建配置 一 .环境准备 1.配置Jenkins server本地Git ...
- 提高开发效率的一些ipython技巧
目录 一.显示ipython快速参考 二.书签功能 三.查看帮助或信息 四.执行python程序 五.执行剪贴板中的代码 六.与操作系统交互 七.测试代码执行时间 八.性能分析 九.matplotli ...
- numpy 读取数据
一.CSV文件 CSV: Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔,逗号 列,换行 行 二.读取数据 1.方法 loadtxt(fname, ...
- idea怎么关闭项目
原文地址:https://jingyan.baidu.com/article/a3a3f8112169e78da2eb8a8d.html idea关闭项目可以按File-CloseProject按钮实 ...
- 机器学习环境配置系列一之CUDA
本文配置的环境为redhat6.9+cuda10.0+cudnn7.3.1+anaonda6.7+theano1.0.0+keras2.2.0+jupyter远程,其中cuda的版本为10.0. 第一 ...