代码:
def merge(left, right):
res = []
while left and right:
if left[0] < right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
res = res + left + right
return res
def mergesort(lists):
if len(lists) <= 1:
return lists
mid = len(lists)//2
left = mergesort(lists[:mid])
right = mergesort(lists[mid:])
return merge(left,right)
内部排序版本
按照<算法导论>实现,在原数组上完成排序:
def merge(lst, l,mid,r):
left = lst[l:mid+1] # + maxint
right = lst[mid+1:r+1] #
k = l
while left and right:
if left[0] <= right[0]:
lst[k] = left.pop(0)
else:
lst[k] = right.pop(0)
k += 1
tail = left if left else right
for n in tail:
lst[k] = n
k += 1
def mergesort(lst,l,r):
if l < r:
mid = (l + r-1)//2
mergesort(lst,l,mid)
mergesort(lst,mid+1,r)
merge(lst,l,mid,r)
测试:
for time in range(10):
a = [random.randint(0,1000) for _ in range(100)] # 生成长度为100的整型数组,元素大小为(0,1000]
res = mergesort(a)
print(bool(res == sorted(a)))
本文介绍了一种经典的排序算法——归并排序,并提供了两种不同的实现方式:一种是返回新数组的递归版本,另一种是在原数组上进行排序的内部排序版本。通过随机生成的数据集验证了算法的有效性。

692

被折叠的 条评论
为什么被折叠?



