代码如下所示:
# -*-coding=utf-8-*- def merge_sort(alist): """归并排序""" n = len(alist) if n<=1: return alist mid = n//2 #print('mid结果是',mid) #mid结果是 4 mid结果是 2 mid结果是 1 mid结果是 1 mid结果是 2 mid结果是 1等等 # print('mid前结果', alist[:mid],'mid后结果', alist[mid:]) """ mid前结果 [54, 26, 93, 17] mid后结果 [77, 31, 44, 55, 20] mid前结果 [54, 26] mid后结果 [93, 17] mid前结果 [54] mid后结果 [26] mid前结果 [93] mid后结果 [17] mid前结果 [77, 31] mid后结果 [44, 55, 20] mid前结果 [77] mid后结果 [31] mid前结果 [44] mid后结果 [55, 20] mid前结果 [55] mid后结果 [20] """ #left 采用归并排序后形成的有序的新的列表 left_li = merge_sort(alist[:mid]) #这个函数是递归分解后的数组 #right 采用归并排序后形成的有序的新的列表 right_li = merge_sort(alist[mid:]) #这个函数是递归分解后的数组 #print('左侧开始结果', left_li, '右侧开始结果', right_li) """ 左侧开始结果 [54] 右侧开始结果 [26] 左侧开始结果 [93] 右侧开始结果 [17] 左侧开始结果 [26, 54] 右侧开始结果 [17, 93] 左侧开始结果 [77] 右侧开始结果 [31] 左侧开始结果 [55] 右侧开始结果 [20] 左侧开始结果 [44] 右侧开始结果 [20, 55] 左侧开始结果 [31, 77] 右侧开始结果 [20, 44, 55] 左侧开始结果 [17, 26, 54, 93] 右侧开始结果 [20, 31, 44, 55, 77] """ #return 999 #将两个有序的子序列合并为一个新的整体 #merge(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 # print('第一次循环result结果',result) # return result #print('左侧result结果',left_li,'右侧result结果',right_li) """ 左侧result结果 [54] 右侧result结果 [26] 左侧result结果 [93] 右侧result结果 [17] 左侧result结果 [26, 54] 右侧result结果 [17, 93] 左侧result结果 [77] 右侧result结果 [31] 左侧result结果 [55] 右侧result结果 [20] 左侧result结果 [44] 右侧result结果 [20, 55] 左侧result结果 [31, 77] 右侧result结果 [20, 44, 55] 左侧result结果 [17, 26, 54, 93] 右侧result结果 [20, 31, 44, 55, 77] """ #print('左侧游标结果',left_pointer,'左侧结果值',left_li[left_pointer:],'右侧游标结果',right_pointer,'右侧结果值',right_li[right_pointer:]) """ 左侧游标结果 0 左侧结果值 [54] 右侧游标结果 1 右侧结果值 [] 左侧游标结果 0 左侧结果值 [93] 右侧游标结果 1 右侧结果值 [] 左侧游标结果 2 左侧结果值 [] 右侧游标结果 1 右侧结果值 [93] 左侧游标结果 0 左侧结果值 [77] 右侧游标结果 1 右侧结果值 [] 左侧游标结果 0 左侧结果值 [55] 右侧游标结果 1 右侧结果值 [] 左侧游标结果 1 左侧结果值 [] 右侧游标结果 1 右侧结果值 [55] 左侧游标结果 1 左侧结果值 [77] 右侧游标结果 3 右侧结果值 [] 左侧游标结果 3 左侧结果值 [93] 右侧游标结果 5 右侧结果值 [] """ 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(sorted_li)