【数据结构】——归并排序

目录

 

一、代码

二、随笔


一、代码

'''
归并排序的主要思路:将两个有序的子列表归并为一个有序的大列表
'''

#归并函数,假设li是由左右两个有序的子列表组成,假设两个子列表都是从小到大排好序的列表
def merge(li,low,mid,high):
	'''
	
	:param li: 由左右两个有序的子列表组成的大列表
	:param low: 列表的起始索引
	:param mid: 两个子列表的分解处的索引,这里取前面子列表的最后一个元素的索引为mid
	:param high: 大列表最后一个索引
	:return: 从小到大排序的列表
	'''

	# 当列表中有两个元素时进行归并操作
	i = low # 第一个子列表的起始索引
	j = mid + 1 # 第二个子列表的起始索引比较好了的元素
	lTmp = [] # 用于保存
	while i <= mid and j <= high: # 当两个子列表都没有遍历完时
		if li[i] > li[j]:
			lTmp.append(li[j])
			j += 1
		else:
			lTmp.append(li[i])
			i += 1
	while i <= mid:# 当右列表访问结束后,直接将左列表进行添加
		lTmp.append(li[i])
		i += 1
	while j <= high:
		lTmp.append(li[j])
		j += 1
	li[low:high+1] = lTmp

#归并排序
def mergeSorted(li,low,high):
	'''
	
	:param li: 列表
	:param low: 列表起始索引
	:param high: 列表结束索引
	:return: 
	'''
	if low < high: # 保证列表右两个元素
		mid = (low + high)//2
		mergeSorted(li,low,mid) # 对左列表进行排序
		mergeSorted(li,mid+1,high) # 对右列表进行排序
		merge(li,low,mid,high) # 将排好序的两个列表进行归并

if __name__ == '__main__':
	import random
	li = list(range(20)) # 随机生成20个数
	random.shuffle(li) # 打乱
	print(li,"未排序的列表")
	print("---------------------------------------")
	mergeSorted(li,0,len(li)-1)
	print(li,"归并排序后的列表")


[11, 8, 13, 1, 4, 3, 18, 7, 14, 10, 19, 0, 9, 12, 2, 6, 5, 15, 17, 16] 未排序的列表
---------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 归并排序后的列表

二、随笔

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有情怀的机械男

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值