用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