归并排序的主要思想是,找到该列表的中间点,然后分别对左右字表分别进行排序,最后将两个排好序的列表组合在一起。还是采取分而治之的思想,用递归的方式将这个列表不停的划分为更小的列表,直到不能再划分为止(left == right)。然后用merge函数将两个排好序的列表不停组合,完成整个列表的排序。
import random#用于测试时生成随机数序列
import numpy#用于生成一个用于排序的空数组空间
def mergesort (listp):
tempbuffer=numpy.empty(len(listp))
mergesorthelper(listp, tempbuffer, 0, len(listp)-1)
def mergesorthelper (listp, tempbuffer, left, right) :
if left < right:
middle = (left + right) // 2
mergesorthelper(listp, tempbuffer, left, middle)
mergesorthelper(listp, tempbuffer, middle+1, right)
merge(listp, tempbuffer, left, middle, right)
def merge(listp, tempbuffer, left, middle, right):
i = left
j = middle+1
for a in range(left, right + 1):
#若i超界但a没有,说明右边的列表一定还有剩余元素。
if i > middle:
tempbuffer[a] = listp[j]
j += 1
elif j > right:
tempbuffer[a] = listp[i]
i += 1
elif listp[i] < listp[j]:
tempbuffer[a] = listp[i]
i += 1
else:
tempbuffer[a]=listp[j]
j += 1
for k in range(left, right+1):
listp[k] = tempbuffer[k]
a=[]
for i in range(50):
a.append(random.randint(0, 100))
print(a)
print('\n')
mergesort(a)
print(a)
归并算法,因为每一层的合并算法复杂度为n,而划分的复杂度由于每次割去一般,复杂度为logn,所以其在所有情况下最大运行时间为nlogn。
numpy库一般用于科学计算,可以轻松的处理数组。numpy.empty(n)就是生成一个有n个元素的数组。