【数据结构&&算法系列】归并排序简单介绍及python代码

归并排序主要采用分治的策略,先对比较小的子序列进行排序,然后对相邻的两个子序列进行合并,依次到对最后剩下的两个子序列进行合并得到最终的排好序的序列。


其中合并两个有序序列的时候可以设置哨兵,哨兵可以减少代码量。对降序排列,哨兵是非常小的数;对升序排序,哨兵是非常大的数。设置哨兵的目的是让所有在哨兵另一边的数参与排序,减少对边界条件的判断。


当然用python语言的时候,merge两个有序序列的时候可以采用下列代码,但为了方便更改为其他语言,最终版本用哨兵的方式进行合并。


注意:

python中用 float("inf")表示正无穷,float("-inf")表示负无穷。

def merge2(arr,p,q,r,reverse=False):
	arr1 = arr[p:q+1]
	arr2 = arr[q+1:r+1]
	k = p
	while arr1 and arr2:
		if reverse==False:
			if arr1[0] <= arr2[0]:
				arr[k] = arr1.pop(0)
			else:
				arr[k] = arr2.pop(0)
			k += 1
		else:
			if arr1[0] >= arr2[0]:
				arr[k] = arr1.pop(0)
			else:
				arr[k] = arr2.pop(0)
			k += 1
	arr[k:r+1] = arr1 + arr2

代码

#coding:utf-8

MAX_MIN = [float("inf"),float("-inf")]

def merge(arr,p,q,r,reverse=False):
	arr1 = arr[p:q+1]
	arr1.append(MAX_MIN[reverse])
	arr2 = arr[q+1:r+1]
	arr2.append(MAX_MIN[reverse])
	i=j=0
	for k in range(p,r+1):
		if reverse==False:
			if arr1[i] <= arr2[j]:
				arr[k] = arr1[i]
				i+=1
			else:
				arr[k] = arr2[j]
				j+=1
		else:
			if arr1[i] >= arr2[j]:
				arr[k] = arr1[i]
				i+=1
			else:
				arr[k] = arr2[j]
				j+=1

def merge_sort(arr, p, r, reverse=False):
	if p < r:
		q = (p+r)/2
		merge_sort(arr, p, q, reverse)
		merge_sort(arr, q+1, r, reverse)
		merge(arr, p, q, r, reverse)
		
def show_arr(arr):
	print "[", ", ".join([str(x) for x in arr]), "]"

if __name__ == "__main__":
	arr1 = [5.2, 2.3, 4.7, 6.9, 1.5, 3.2]
	merge_sort(arr1, 0, len(arr1)-1)
	show_arr(arr1)

	arr2 = [7, 4, 2, 5, 1, 6, 9, 1]
	merge_sort(arr2, 0, len(arr2)-1, reverse=True)
	show_arr(arr2)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值