京公网安备 11010802034615号
经营许可证编号:京B2-20210330
Python编程中归并排序算法的实现步骤详解
基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。
归并操作过程:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
上述说法是理论表述,下面用一个实际例子说明:
例如一个无序数组
[6,2,3,1,7]
首先将这个数组通过递归方式进行分解,直到:
[6],[2],[3],[1],[7]
然后开始合并排序,也是用递归的方式进行:
两个两个合并排序,得到:
[2,6],[1,3],[7]
上一步中,其实也是按照本步骤的方式合并的,只不过由于每个list中一个数,不能完全显示过程。下面则可以完全显示过程。
初始:
a = [2,6] b = [1,3] c = []
第1步,顺序从a,b中取出一个数字:2,1 比较大小后放入c中,并将该数字从原list中删除,结果是:
a = [2,6] b = [3] c = [1]
第2步,继续从a,b中按照顺序取出数字,也就是重复上面步骤,这次是:2,3 比较大小后放入c中,并将该数字从原list中删除,结果是:
a = [6] b = [3] c = [1,2]
第3步,再重复前边的步骤,结果是:
a = [6] b = [] c = [1,2,3]
最后一步,将6追加到c中,结果形成了:
a = [] b = [] c = [1,2,3,6]
通过反复应用上面的流程,实现[1,2,3,6]与[7]的合并
最终得到排序结果
[1,2,3,6,7]
本文列举了三种python的实现方法:
方法1:将前面讲述的过程翻译过来了,略先拙笨
#! /usr/bin/env python
#coding:utf-8
def merge_sort(seq):
if len(seq) ==1:
return seq
else:
middle = len(seq)/2
left = merge_sort(seq[:middle])
right = merge_sort(seq[middle:])
i = 0 #left 计数
j = 0 #right 计数
k = 0 #总计数
while i < len(left) and j < len(right):
if left[i] < right [j]:
seq[k] = left[i]
i +=1
k +=1
else:
seq[k] = right[j]
j +=1
k +=1
remain = left if i<j else right
r = i if remain ==left else j
while r<len(remain):
seq[k] = remain[r]
r +=1
k +=1
return seq
方法2:在按照顺序取数值方面,应用了list.pop()方法,代码更紧凑简洁
#! /usr/bin/env python
#coding:utf-8
def merge_sort(lst): #此方法来自维基百科
if len(lst) <= 1:
return lst
def merge(left, right):
merged = []
while left and right:
merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
while left:
merged.append(left.pop(0))
while right:
merged.append(right.pop(0))
return merged
middle = int(len(lst) / 2)
left = merge_sort(lst[:middle])
right = merge_sort(lst[middle:])
return merge(left, right)
方法3:原来在python的模块heapq中就提供了归并排序的方法,只要将分解后的结果导入该方法即可。
#! /usr/bin/env python
#coding:utf-8
from heapq import merge
def merge_sort(seq):
if len(seq) <= 1:
return m
else:
middle = len(seq)/2
left = merge_sort(seq[:middle])
right = merge_sort(seq[middle:])
return list(merge(left, right)) #heapq.merge()
if __name__=="__main__":
seq = [1,3,6,2,4]
print merge_sort(seq)
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
【核心关键词】大数据、零售商、消费者、供应链、运营、企业、产品、客户、数据模型、大数据平台、数据开发、系统运维、业务逻 ...
2026-06-26在物流配送、供应链履约、终端供货等业务场景中,送货率是衡量企业履约能力、服务质量、供应链稳定性的核心业务指标,直接关联客 ...
2026-06-26 很多数据分析师精通描述性统计,能熟练计算均值、中位数、标准差,但当被问到“用500个样本如何推断10万用户的真实满意度” ...
2026-06-26在数字化管理与数据化运营体系中,指标是连接原始数据与业务决策的核心载体。零散的原始数据只是无意义的数值堆砌,无法直接反映 ...
2026-06-25在Excel数据汇总、财务统计、业务复盘等日常办公场景中,经常需要完成逐行相乘、整体汇总求和的计算需求,最典型的场景就是:单 ...
2026-06-25 很多数据分析师沉迷于复杂的机器学习算法,却忽略了数据分析最基础也最核心的能力——描述性统计。事实上,80%的商业分析问 ...
2026-06-25【核心关键词】主数据、资产、供应商、现金流、企业、精细化、集团、数字化、中国、数据质量、数据管理、经营管理、地产行业、 ...
2026-06-24在数据分析、假设检验、AB测试、学术研究等统计场景中,显著水平(α)与P值(P-value)是判断统计结果是否具有统计学意义的两个 ...
2026-06-24小李刚入职了一家互联网公司的运营部门。第一次参加业务复盘会,运营主管问了一个看似简单的问题:“这个月新用户留存率下降了5 ...
2026-06-24在数字化转型全面渗透的产业背景下,数据分析已成为互联网、金融、零售、制造等几乎所有行业的核心岗位能力。很多初学者对数据分 ...
2026-06-23在企业并购、股权定价、投融资评估、资产核算等资本市场核心场景中,市场法是应用最广泛、市场认可度最高的企业价值评估方法。传 ...
2026-06-23 许多数据分析师精通Excel函数和SQL查询,但当面对一张上万行的销售明细表,要快速回答“哪个地区销量最高”“哪款产品增长最 ...
2026-06-23【核心关键词】运营、证书、金融、客户、产品、软件、销售额、量化、科技、数据分析、金融行业、证券类软件、业务流程、金融机 ...
2026-06-22在企业方案选型、产品迭代评审、供应商筛选、运营效果复盘等决策场景中,单一指标的优劣判断往往无法支撑科学决策。一套转化效果 ...
2026-06-22 很多数据分析师掌握了Excel函数、会写SQL查询,但当被问到“数据从哪里来”“数据加工有哪些步骤”“如何使用分析工具连接数 ...
2026-06-22【核心关键词】软件、洞察力、大数据、产品、经验、硬件、流量、创新、决策、数据安全、网络安全、数据分析、决策制定、数据挖 ...
2026-06-18在方案选型、效果复盘、产品评估、供应商筛选等各类业务决策场景中,仅凭单一指标下结论往往会陷入 “以偏概全” 的误区。多维度 ...
2026-06-18 很多数据分析师精通Excel单元格操作,但当被问到“表结构数据的基本处理单位是什么”“字段和记录的本质区别”“为什么表结 ...
2026-06-18在数据分析、用户运营与业务增长的工作体系中,漏斗拆解是最基础也最高频的问题定位方法。很多业务场景下,我们只能看到最终的转 ...
2026-06-17在数据库开发、数据清洗与报表统计场景中,数值类型转换为日期是高频刚需操作。业务系统常以 Unix 时间戳、整型日期(如20240617 ...
2026-06-17