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 ...
随机推荐
- 【记】本地远程连接VM VirtualBox中虚拟机Centos6的数据库MySQL
目标:远程连接虚拟机中的MySQL 效果图如下 1. VBox设置好端口转发 具体步骤请看 VM VirtualBox 网络地址转换(NAT)使用详解 2. MySQL授权 如果这时我们就去远程连接M ...
- Apache Hudi使用问题汇总(一)
1.如何写入Hudi数据集 通常,你会从源获取部分更新/插入,然后对Hudi数据集执行写入操作.如果从其他标准来源(如Kafka或tailf DFS)中提取数据,那么DeltaStreamer将会非常 ...
- vue实现checked 全选功能
记录一下 module.data = { result: {}, items: [] //初始化全选按钮, 默认不选 ,isCheckedAll: false};module.vue = new V ...
- python3三元运算
条件:简单的条件判断语句并且有返回值 作用:简化代码和装X 格式:为True执行的语句 if 判断条件 else 为False执行的语句 例子 def f(a, b): ""&qu ...
- Splash简单应用
jd->iphone import requests from lxml import etree # search_key = 'iphone' jd_url = "https:// ...
- 《爬虫学习》(二)(urllib库使用)
urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. 1.urlopen函数: 在Python3的urllib库中,所有 ...
- 指定HTML标签属性 |Specifying HTML Attributes| 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
结果呢: <a class="myCSSClass" href="/" id="myAnchorID">This is an o ...
- 使用整体模型模板辅助器 Using Whole-Model Templated Helpers 模板辅助器方法 精通ASP.NET MVC 5
怎么会
- openjudge 拯救公主
点击打开题目 看到这道题,第一感觉是我有一句m2p不知当讲不当讲 传送门就算了,你提莫还来宝石,还不给我每种最多有几个~~ 在一般的迷宫问题里,无论已经走了多少步,只要到达同一个点,状态便是等价的,但 ...
- JAVA WebSocket 使用时需要注意的地方
最近在做一个项目,需要用WebSocket与另外一个平台建立通讯,来获取项目业务需要的实时数据,因此项目一启动,后台就要与另外一个平台建立WebSocket连接并且要保证他们的之间有且只有一条持续畅通 ...