#程序主要分为三个部分,最外层的循环用来控制进行多少次归并排序,第二层循环用来控制在每次归并排序 #第三个循环是用来控制在每一次的归并排序中相邻的两个序列的合并 #归并排序需要额外的存储空间,空间的大小和原表的大小相同,而且每次归并的结果都是基于上一次排序的结果,所以可以循环利用这两张表 #第一个merge函数,用来将相邻的序列进行合并,需要指定两个序列的位置,方法是依次取出两个序列的最小元素,将两个最小的进行 #比较,选取最小的元素放在新表对应的位置,当有一个先结束的时候,直接将另一个表剩余的元素加进去 def merge(lfrom,lto,low,mid,high): i,j,k = low, mid,low #两个相邻序列的范围为[low,mid],[mid,low],合并之后的序列为[low,high] while i<mid and j<high: if lfrom[i] < lfrom[j]: lto[k] = lfrom[i] i += 1 else: lto[k] = lfrom[j] j += 1 k += 1 while i < mid: lto[k] = lfrom[i] i += 1 k += 1 while j < high: lto[k] = lfrom[j] j += 1 k += 1 #下面这个函数用来控制每一次的归并排序 ,llen表的总长度,slen每个分段的长度,在每一次合并的时候,首先两两合并,也就是说每次合并的范围为2*slen def mege_pass(lfrom,lto,llen,slen): i = 0 while i + 2 *slen < llen: merge(lfrom,lto,i,i+slen,i+2*slen) i += 2*slen if i +slen < llen:#还剩下两段序列,但是其中一个序列的长度小于slen merge(lfrom,lto,i,i+slen,llen) else: for j in range(i,llen): lto[j]= lfrom[j] #最后一个函数控制归并排序的次数,归并结束的条件是最后一次归并后,子序列的长度等于原表的长度 #templst和lst轮流充当被归并表和归并完成后的表 def merge_sort(lst): slen,llen = 1,len(lst) templst = [None]*llen while slen < llen: mege_pass(lst,templst,llen,slen) slen *=2 mege_pass(templst,lst, llen, slen) slen *=2 return lst print(merge_sort([3,4,8,0,1,2,15,5,20])) #结果[0, 1, 2, 3, 4, 5, 8, 15, 20]
Python实现归并排序
最新推荐文章于 2024-07-19 17:03:11 发布