先拆成单个单个,再两两向上合,边合边排序
def merge_sort(alist):
'''归并排序'''
n = len(alsit)
#拆到不能再拆时退出函数,并返回那个不能拆的列表
if n <= 1:
return alist
#对半分
mid = n//2
left_li = merge_sort(alist[:mid]) #前半部分,left_li代表采用归并排序后形成的有序的新的列表
right_li = merge_sort(alist[mid:]) #后半部分,right_li代表采用归并排序后形成的有序的新的列表
#将left和right部分合并
#做两个指针(本质是索引)
left_pointer,right_pointer = 0,0
#存放结果的容器
result = []
#当左右的指针都还没走到头,继续执行循环
while left_pointer<len(left_li) and right_pointer<len(right_li):
if left_li[left_pointer] <= right_li[right_pointer]
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
#走出循环后,将剩余未添加进容器的元素加进去(因为递归到最底层,返回的左右两边列表都是有序的,只要进行两边的比较就行)
result += left_li(left_pointer:]
result += right_li[right_pointer:]
return result
if __name__ == '__main__':
li = [54,26,93,17,77,31,44,55,20]
print(li)
sorted_li =merge_sort(li)
print(li) #原列表,并没有改变
print(sorted_li) #返回的排序好之后的新列表
最坏时间复杂度和最优时间复杂度都是O(nlogn)
稳定性:稳定