python算法与数据结构-归并排序算法

代码如下所示:

# -*-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)

猜你喜欢

转载自blog.csdn.net/gb4215287/article/details/107466881