Python归并排序

1 篇文章 0 订阅
1 篇文章 0 订阅

一、归并排序

1、理解: 归并排序是将一个列表每次都分为两个部分,然后分别进行排序,然后再进行合并,合并的过程中,是由两个有序的列表进行合并的,先分别定义,两个列表的下标,然后分别比较下标的值,然后将下标较小的数添加到新的列表中,数字小的乙方下标后移,依次来完成合并操作。

时间复杂度为: O(nlogn), 归并排序是利用开辟新的空间来达到减少时间复杂度的目的。

代码:

#先定义一个merge_sort(li), 实现对列表进行 递归 分割。
def merge_sort(li):
	if len(li) <= 1:    #此时列表的长度为1,则表明已经是最小的元素了
		return li
	
	num = len(li)//2
	#递归操作开始
	left = merge_sort(li[:num])    #利用切片开始分为left,right部分
	right = merge_sort(li[num:])
	return merge(left, right)


def merge(left, right):
	l, r = 0, 0
	result = []
	while l < len(left) and r <len(right):
		if left[l] < right[r]:      # 如果left列表中元素小于right中相同位置元素
			result.append(left[l])
			l += 1
		else:                        # 添加right列表中元素
			result.append(right[r])
			r += 1
		
		#将剩余的元素添加
		## 因为合并之前已经是排序过的(利用递归操作),所以合并后的列表也是排序过的
		result += left[l:]
		result += right[r:]
		return result


if __name__ == '__main__':
	list1 = [1, 0, 2, 4, 8, 0, 1,100, 5]
	list1 = merge_sort(list1)
	print(list1)     # [0, 0, 1, 2, 4, 8, 1, 5, 100]


望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值