[转载] 算法导论:分治法,python实现合并排序MERGE-SORT
参考链接: Python中的合并排序merge sort
1. 简单合并排序法实现
思想:两堆已排好的牌,牌面朝下,首先掀开最上面的两张,比较大小取出较小的牌,然后再掀开取出较小牌的那一堆最上面的牌和另一堆已面朝上的牌比较大小,取出较小值,依次类推......
"""合并两个已经排好的子列表"""
ListB = [2, 4, 5, 7, 1, 2, 3, 6]
ListB_L = ListB[0: int((len(ListB))/2)]
ListB_R = ListB[int((len(ListB))/2): len(ListB)] # 把列表B分为左右两块,可以发现L和R已经排好序了
ListB_L.append(99999)
ListB_R.append(99999) # 在每个子列表的底部放置哨兵牌
i = 0
j = 0
for n in range(0, len(ListB)):
if ListB_L[i] <= ListB_R[j]:
ListB[n] = ListB_L[i]
i = i + 1 # 依次取两个子列表的较小值填入列表B中
else:
ListB[n] = ListB_R[j]
j = j + 1
print(ListB)
2. 合并排序元素个数为2的幂数的列表
思想:将原始列表中的元素,拆分为个数为2的子列表,将每个子列表进行合并排序,加以整合变为左右两部分都排好序的元素个数为4的子列表.......
"""合并长度为2的幂数的无序列表"""
B1 = [2, 1, 5, 7, 4, 2, 3, 6]
def MERGE_SORT(B):
# 定义合并排序函数
L = B[0: int((len(B)) / 2)]
R = B[int((len(B)) / 2): len(B)]
L.append(99999)
R.append(99999) # 在每个子列表的底部放置哨兵牌
i = 0
j = 0
for n in range(0, len(B)):
if L[i] <= R[j]:
B[n] = L[i]
i = i + 1 # 依次取两个子列表的较小值填入列表B中
else:
B[n] = R[j]
j = j + 1
return(B)
def dividelist(B0):
L0 = B0[0: int((len(B0)) / 2)]
R0 = B0[int((len(B0)) / 2): len(B0)] # 定义拆分函数,把列表分为左右两个子列表
return L0, R0
L1, R1 = dividelist(B1)
LL1, RL1 = dividelist(L1) # 这部分最终将8个数的列表分为,4个2个元素的子列表
LR1, RR1 = dividelist(R1)
MERGE_SORT(LL1)
MERGE_SORT(RL1) # 调用合并排序函数,把元素个数为2的4个子列表各自排好序
MERGE_SORT(LR1)
MERGE_SORT(RR1)
L1 = LL1 + RL1
R1 = LR1 + RR1 # 将排好序的4个子列表两两合并为元素个数为2的左右两部分都排好序的子列表
MERGE_SORT(L1)
MERGE_SORT(R1) # 把元素个数为4的两个子列表排好序
B1 = L1 + R1 # 合并为一个元素个数为8的即包含原始列表所有元素的左右两部分都排好序的完整列表
MERGE_SORT(B1) # 调用合并排序函数,得到最终结果
print(B1)存在的问题,拆分和整合部分由于自己目前能力不足,手动写了一下。但根据分治法的原理,整个算法的运行速度比普通排序要快,时间复杂度为O(n*lgn),插入排序法时间复杂度为O(n^2)。
3. 用Python实现任意排列数组的合并排序
"""Python实现合并排序"""
def MERGE(A, p, q, r):
"""定义合并函数"""
n1 = q - p
n2 = r - q
L = []
R = [] # 定义左右两个空数组
for i in range(0, n1):
L.append(A[p + i])
for j in range(0, n2):
R.append(A[q + j])
L.append(float('inf'))
R.append(float('inf')) # 添加哨兵牌
i = 0
j = 0
for n in range(p, r):
if L[i] <= R[j]:
A[n] = L[i]
i = i + 1
else:
A[n] = R[j]
j = j + 1
return A
def MERGE_SORT(A, p, r):
"""定义MERGE_SORT函数,对一个数列实现合并排序"""
if p + 1 < r:
q = int((p + r)/2)
MERGE_SORT(A, p, q) # 调用MERGE子函数
MERGE_SORT(A, q, r)
MERGE(A, p, q, r) # 调用MERGE函数实现左右两部分已排好序的数列的合并
return A
A = [4, 1, 2, 6, 3, 2, 5, 7]
C = MERGE_SORT(A, 0, len(A))
print(C)
[转载] 算法导论:分治法,python实现合并排序MERGE-SORT相关推荐
- python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...
1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...
- 《算法导论》(一)--插入排序与合并排序
插入排序 书上说的很好,用打牌作比方.就是一边是排好序的,剩下的是待排序的,每次取一个待排序的元素,找到按序的位置,插入已排好序的部分中.元素取完也就结束了.复杂度O(n^2). 代码: 1 #inc ...
- 合并排序merge sort
合并排序算法是用分而治之的策略实现对n个进行排序. 合并排序的基本思想:将需要排序的元素分成数量大概相等的2个子集合,分别给2个子集合进行排序,最终将2个排序好序的子集合合并成一个集合. 现比如有集合 ...
- 趣学算法系列-分治法
趣学算法系列-分治法 声明:本系列为趣学算法一书学习总结内容,在此推荐大家看这本算法书籍作为算法入门, 原作者博客链接,本书暂无免费电子版资源,请大家支持正版,更多实例分析请查看原书内容 第三章 分治 ...
- MIT算法导论03-分治法
MIT算法导论03-分治法(Divide and Conquer) 课程名:Introduction to Algorithms 课程编号:6.046J/18.410J 授课教师:Prof.Erik ...
- python分治算法_Python算法:分治法
本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法 本节的标题写全了就是:divide the problem instance, solve subproblems recur ...
- 从合并排序算法看“分治法”
本文内容 分治策略 分治步骤 从合并排序看"分治策略" 分治策略 分治法(divide-and-conquer),"分治法策略"是一种很重要的算法.顾名思义,& ...
- python分治算法_python算法实现-分治法
分治法概念将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----"分" 将最后子问题可以简单的直接求解----"治" 将所有子问 ...
- python分治算法_分治法及其python实现例子
在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...
最新文章
- 【江苏】2021年下半年软考报考时间及通知
- Jquery$和$$的区别
- 设计模式:装饰模式(Decorator)
- [设计原则与模式] 如何理解TDD的三条规则
- 机箱硬盘指示灯不亮_安钛克DF600 FLUX机箱:FLUX平台第一款机箱,为全民电竞热“降温”...
- mysql实现阻塞队列_阻塞队列--LinkedBlockingQueue
- Java语言基础(4)
- Spark 自己实现分箱逻辑遇到的坑
- java学习随笔(三)
- A*算法收敛最优点的简单证明
- javascript 学习指南--语法
- 传统模式下安装linux,在将引导顺序更改为传统模式或在传统模式下安装操作系统时找不到引导设备...
- 下载神器aria2的yaaw WebUI用法
- 超全整理——相机标定知识汇总
- 【FPGA】VGA驱动:行同步时序+场同步时序
- 微信会员卡实现门店信息化会员管理
- 对象、继承、封装、多态、抽象类的组合应用:编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个Employee对象的生日,则将在该雇员的工资上增加100元发给他。
- DC(Design Compiler)使用说明
- L2-离散变量分布:Bernoulli分布、二项分布、泊松分布等
- Core Bluetooth框架之一:Central与Peripheral
热门文章
- Firefox的缓存问题
- Codeforces Round #757 (Div. 2)ABCD1
- android 悬浮按钮 功能实现,Android自定义悬浮按钮效果实现,带移动效果
- php 科学计数加1,PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法_php技巧...
- for循环执行 mybatis_MyBatis 插件机制详解
- 快速排序 与 归并排序
- angular学习笔记
- 有向图的传递闭包实现三种实现(Warshall+DFS+BFS)
- 不安全的Url重定向原理概述和案例
- 2018 CodeM初赛B轮:D.神奇盘子