python 归并排序

用python实现了三种归并排序算法,第一种采用递归实现,第二种采用迭代实现,第三种也是迭代实现,但是当元素基本有序时第三种更加高效。递归的实现很简单,迭代算法不如递归容易理解但是更高效。对于归并排序,递归和迭代的效率差不多。但递归比迭代需要消耗额外的栈空间。但递归算法要不迭代算法简洁,容易理解。递归更符合人类的思考习惯,鱼与熊掌不可兼得。大部分递归算法可以实现的程序,迭代也可以。很多用递归很容易实现的算法,使用迭代却很困难。废话不说了下面是程序代码:


#!/bin/python
#以下代码经过测试。

#对list中的两段有序序列[l,m)[m,h)合并。
#合并策略由函数f提供
def merge(list,l,m,h,f):
	tmp=[]
	i,j=l,m
	while i<m and j<h:
		if f(list[i],list[j]):
			tmp.append(list[i])
			i+=1
		else:
			tmp.append(list[j])
			j+=1
	if i==m:
		tmp+=list[j:h]
	else:
		tmp+=list[i:m]
	list[l:h]=tmp[:]
	
#从list中找到以i为起点的有序区间,返回区间的下一个下标。
def getbound(list,i,f):
	while i+1<len(list) and f(list[i],list[i+1]):
		i+=1
	return i+1
	
#递归实现很简单,不解释。	
def mergesort1(list,l,h,f):
	if l<h-1:
		m=(l+h)/2
		mergesort2(list,l,m,f)
		mergesort2(list,m,h,f)
		merge(list,l,m,h,f)
#一般的迭代算法,模拟递归的实现。
#首先size取1,单个元素肯定为有序元素,然后相邻的合并。
#得到size为2的有序元素然后相邻的合并....
#当整个序列有序时停止迭代。
def mergesort2(list,f):
	size=1
	while size<len(list):
		l=0
		while l+size<len(list):
			m=l+size
			h=m+size
			if h>len(list):
				h=len(list)
			merge(list,l,m,h,f)
			l=h
		size*=2
#迭代算法2,上面的迭代算法当元素基本有序时效率不高。
#首先找个以第0个元素开始的有序区间,然后在该有序区间之后
#再找到一段有序区间。然后对这两个区间合并重复以上操作

def mergesort3(list,f):
	while 1:
		l=0
		m=getbound(list,l,f)
		if m==len(list):
			break
		while m<len(list):
			h=getbound(list,m,f)
			merge(list,l,m,h,f)
			if h==len(list):
				break
			l=h
			m=getbound(list,l,f)
			
l=[1,4,7,2,10,19,28,26,-12,14,23,4,187,-2]
#采用匿名函数,函数式编程的风格。
#在python中数据和代码的界限进一步的缩小
#代码也是对象,可以当参数传递,太爽了
mergesort2(l,0,len(l),lambda x,y:x>=y)
print l


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值