归并排序
def merge(left, right):
'''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组'''
#left与right的下标指针
l, r = 0, 0
result = []
while l<len(left) and r<len(right):
if left[l] < right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
result += left[l:]
result += right[r:]
return result
def merge_sort(alist):
if len(alist)<=1:
# print(alist)
return alist
num=len(alist)//2
left = merge_sort(alist[:num])
right = merge_sort(alist[num:])
return merge(left,right)
print(merge_sort([3,1,2,5,4,6,9,7,8]))
注意合并的时候,都是合并右半部分的。
分而治之策略
def divide(alist):
if len(alist)<=1:
return alist
n=len(alist)
num=n//2
left=divide(alist[:num])
right=divide(alist[num:])
return conquer(left,right)
def conquer(left,right):
l,r=0,0
res=[]
while l<len(left) and r<len(right):
if left[l]<right[r]:
res.append(left[l])
l+=1
else:
res.append(right[r])
r+=1
res+=left[l:]
res+=right[r:]
return res
alist = divide([3, 1, 2, 4, 5, 9, 7, 8])
print(alist)