归并排序(Python)

归并排序

稳定排序,时间复杂度O(nlogn)
归并排序算法会把序列分成长度相同的两个子序列(如果序列长度为奇数,则一个序列比另一个序列多一个元素),当无法继续往下分时(也就是每个子序列中只有一个数据时),就对子序列进行归并。归并指的是把两个排好序的子序列合并成一个有序序列。该操作会一直重复执行,直到所有子序列都归并为一个整体为止。
步骤:

原序列
将原序列分成两个子序列
在这里插入图片描述将每一个子序列看成一个整体,继续拆分
在这里插入图片描述直至每个子序列,只有一个数据时,如下面所示。
在这里插入图片描述下面开始对分割的元素开始合并,合并时需要将数字按从大到小排列,把6和4合并,合并后的顺序是[4,6]
在这里插入图片描述把3和7合并,合并后的顺序是[3,7]
在这里插入图片描述合并这种含有多个数字的子序列时,要先比较首位数字,再移动较小的数字。
在这里插入图片描述由于4>3,所有将3先合并到序列中
在这里插入图片描述然后再次比较序列中剩下的首位数字
在这里插入图片描述由于7>4,所以将4合并到序列中
在这里插入图片描述然后比较6和7,因为7>6,所以先将6合并到序列中,然后再将7合并到序列中
在这里插入图片描述递归执行上面的操作,直到所有的数字都合为一个整体为止,最后的结果如下:
在这里插入图片描述

代码
def merge(arr,l,m,r):
	# 归并序列
	# l -- 序列的最左 下标
	# m -- 序列的中间 下标
	# r -- 序列的最右 下标
	left_arr = []
	right_arr = []
	for i in range(l,m+1):
		left_arr.append(arr[i])
	for j in range(m+1,r+1):
		right_arr.append(arr[j])
	
	i,j,k = 0,0,l
	n1 = len(left_arr)
	n2 = len(right_arr)
	while i < n1 and j < n2:
		if left_arr[i] < right_arr[j]:
			arr[k] = left_arr[i]
			i += 1
		else:
			arr[k] = right_arr[j]
			j += 1
		k += 1
	while i < n1:
		arr[k] = left_arr[i]
		i += 1
		k += 1
	while j < n2:
		arr[k] = right_arr[j]
		j += 1
		k += 1

def merge_sort(arr,l,r):
	if l < r:
		m = int((l+r)/2)
		merge_sort(arr,l,m)
		merge_sort(arr,m+1,r)
		merge(arr,l,m,r)

if __name__ == "__main__":
	arr = [15,8,32,42,25,41]
	merge_sort(arr,0,len(arr)-1)
	print("排序之后:",arr)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值