排序算法-归并排序(python)

由于最近要找工作,所以频繁刷题,算法题中,排序算法用的比较多,我看过非常多的排序算法,突然需要自己实现的时候,感觉并不是很熟练,有时候细节部分也记得不太清楚,因此,对于常考的算法题,自己记录下来,以便以后不懂的时候能迅速再看明白。

思路

关于归并排序,其主要思路是,对一个数组按照一个位置(一般是中点)将数组划分成两个部分,并依次对两个部分继续同样的操作,即继续对按照一个点进行二分,直至每个小部分剩下1~2个数据,然后对小块数据进行排序,然后依次合并、排序、合并、排序……
这种可以用递归来实现,递归的是二分,向上是合并+排序。关于二分,不需要真的分成两块,只需要记录其两块的起止指针即可。其排序过程是建立一个同样大小的数组,对两块数组(已排序好),两个指针分别指向其初始位置,依次比较选择其较大(小)的数据,然后提取数据之后的指针后移,即依次遍历两块数据,把较大数据依次填充到新数组中,这样就完成小块数组的合并+排序,最后的数组就是都排好序了的。
归并排序是个稳定的算法,其时间复杂度为nlog(n)。
后续有时间会继续补充……

代码

#归并排序
def mergesort(arr,l,mid,r):
	aux = []
	for i in arr:
		aux.append(i)
	i = l
	j = mid+1
	for k in range(l,r+1):
		if j>r:
			arr[k] = aux[i]
			i += 1
		elif i>mid:
			arr[k] = aux[j]
			j += 1
		elif aux[i] < aux[j]:
			arr[k] = aux[i]
			i += 1
		else:
		 	arr[k] = aux[j]
		 	j += 1
	return arr

def merge(arr,l,r):
	if r<=l:
		return arr
	mid = int((l+r)/2)
	arr = merge(arr,l,mid)
	arr = merge(arr,mid+1,r)
	arr = mergesort(arr,l,mid,r)
	return arr

arrs = [1,4,3,2,4,9,5,3,354,5,4,56,6,3]
print(merge(arrs,0,len(arrs)-1))

#调试
arrs = [1,4,3,2,4,9,5,3,354,5,4,56,6,3]
print(merge(arrs,0,len(arrs)-1))
#输出
[1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 9, 56, 354]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值