归并排序

归并排序的思想是先递归分解数组,再合并数组,将数组分解最小之后,然后合并两个有序数组,基本思想就是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可

# -*- coding: utf-8 -*-
"""
归并排序:
merge_sort  54 26 93 17 77 31 44 55 56
..............................................................
拆:
           54 26 93 17           77 31 44 55 56
        54 26      93 17      77 31    44 55 56
    54  26      93  17      77  31    44  55 56
...............................................................
合:
    26 54      17 93        31 77     44 55 56
    R           L           R          L
    17 26 54 93         31 44 55 56 77
    R                   L
    17 26 31 44 54 55 56 77 93
...............................................................
"""
def merge_sort(alist):
    n=len(alist)
    if n<=1:
        return alist
    mid=n//2
    # left 采用归并排序后形成的有序的新得列表
    left_li=merge_sort(alist[:mid])

    right_li=merge_sort(alist[mid:])

    # 将两个有序的子序列合并为一个新得整体
    # 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
    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)
原文地址:https://www.cnblogs.com/bashliuhe/p/14952781.html