时间复杂度O(nlogn)
运行时间对比:快排<归并<堆排
极端情况下:
快排:极端下效率低
归并:需要额外的内存开销
堆排:在极端快的排序中相对较慢
先分解成2段,然后递归的每一段再分解,直至分解成一个一个的数,然后对比大小排序兵合并为2个数,4个数,8个数这样

def merge(list,low,mid, hight):
    i = low
    j = mid + 1
    tmp = []
    while i <= mid and j <= hight: 
        if list[i] < list[j]:
            tmp.append(list[i])
            i += 1
        else:
            tmp.append(list[j])
            j += 1
    while i <= mid: #若右边没数了,左边还有
        tmp.append(list[i])
        i += 1
    while j <= hight: #若左边没数了,右边还有
        tmp.append(list[j])
        j += 1
    list[low:hight+1] = tmp

def merge_sort(list,low,hight):
    if low< hight:
        mid = (low + hight) // 2 #分解成2段
        merge_sort(list,low,mid) #分解左边那一段
        merge_sort(list,mid+1,hight) #分解右边那一段
        merge(list,low,mid,hight) #排序合并起来,到这一步时已经是一个一个的数了,因为前面已经递归到最深处,所以合并2,4,8,...个数,慢慢往外层合并
abc = list(range(10))
random.shuffle(abc)
print(abc)
merge_sort(abc,0,len(abc)-1)
print(abc)