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 - 归并排序的更多相关文章

  1. 【LeetCode】分治法 divide and conquer (共17题)

    链接:https://leetcode.com/tag/divide-and-conquer/ [4]Median of Two Sorted Arrays [23]Merge k Sorted Li ...

  2. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  3. 算法上机题目mergesort,priority queue,Quicksort,divide and conquer

    1.Implement exercise 2.3-7. 2. Implement priority queue. 3. Implement Quicksort and answer the follo ...

  4. [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 ...

  5. [LeetCode] 系统刷题4_Binary Tree & Divide and Conquer

    参考[LeetCode] questions conlusion_InOrder, PreOrder, PostOrder traversal 可以对binary tree进行遍历. 此处说明Divi ...

  6. [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 ...

  7. 分治法 - Divide and Conquer

    在计算机科学中,分治法是一种很重要的算法.分治法即『分而治之』,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的 ...

  8. [算法]分治算法(Divide and Conquer)

    转载请注明:http://www.cnblogs.com/StartoverX/p/4575744.html 分治算法 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是 ...

  9. Divide and Conquer.(Merge Sort) by sixleaves

    algo-C1-Introductionhtml, body {overflow-x: initial !important;}html { font-size: 14px; }body { marg ...

随机推荐

  1. 移动端保存当前屏幕内容为图片,canvas图片拼接

    需求:1.移动端点击分享时,截屏当前屏幕,并保存为图片  2.将截屏的图片与一张二维码图片进行拼接后,生成一张新的图片 技术栈:html2canvas.js.canvas2image.js 代码:(j ...

  2. Java 基础(三)| IO流之使用 File 类的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 File 类? java ...

  3. 矩形内的递推dp

    链接:https://www.nowcoder.com/acm/contest/130/B来源:牛客网 黑妹和黑弟又聚在一起玩游戏了,这次他们选择在一个n*m的棋盘上玩游戏,棋盘上的每个方格都有一个非 ...

  4. SpringCloud之Eureka(注册中心集群篇)(三)

    一:集群环境搭建 第一步:我们新建两个注册中心工程一个叫eureka_register_service_master.另外一个叫eureka_register_service_backup eurek ...

  5. Java 方法重写方法重载

    1,方法的重载和方法的重写 方法名相同形参列表不通 方法名字的重新定义2,面向过程是分步骤解决问题 用方法组织代码 面向对象是以分类的方式解决问题 用类住址代码3 类是对对象的抽象 对象万事万物都是对 ...

  6. C++数值计算

    1.序 (1)程序设计分两种: 1.结构化设计(面向过程)——分解算法为模块,将算法的步骤分解为模块. 2.面向对象程序设计——主要是“类”与“对象”. (2)进制的转换 1.二进制转十进制 整数部分 ...

  7. 异常java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;

    java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava ...

  8. es7中数组如何判断元素是否存在

    const arr = [1,2,3,4,5,6] console.log(arr.includes(4)) //true

  9. HGE引擎改进——2014/2/18 和 2014/2/27

    2014/2/18 更新 hgehelper库:增加hgeSkeleton类,该类用于播放骨骼动画 增加工具骨骼动画编辑器(AnimationEd),该工具用于骨骼动画的编辑 2014/2/27 更新 ...

  10. c#数字图像处理(十二)图像的腐蚀与膨胀

    背景知识 腐蚀与膨胀基本原理:就是用一个特定的结构元素来与待处理图像按像素做逻辑操作:可以理解成拿一个带孔的网格板(结构元素矩阵中元素为1的为孔)盖住图像的某一部分,然后按照各种不同的观察方式来确定操 ...