归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

算法描述

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列
def mergeSort(alist):
    """归并排序(稳定|nlgn)"""
    n = len(alist)
    if n <= 1:
        return alist
    mid = n//2
    
    #left 采用归并排序后形成新的有序列表
    left_li = mergeSort(alist[:mid])
    #right 采用归并排序后形成新的有序列表
    right_li = mergeSort(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