Python归并排序

def MergeSort(nums):
    """自底向上的二路归并算法"""
    length = 1
    while length < len(nums):
        MergePass(nums, length)
        length *= 2


def MergePass(nums, length):
    """对整个表进行一趟归并"""
    i = 0
    # 归并length长的两相邻子表
    while i+2*length-1 < n:
        merge(nums, i, i+length-1, i+2*length-1)
        i += 2*length
    # 归并余下两个子表,后者长度小于length
    if i+length-1 < n:
        merge(nums, i, i+length-1, len(nums)-1)

def merge(nums, low, mid, high):
    """归并相邻的两个有序表
    low: 第1段的首下标
    mid: 第1段的尾下标
    high: 第2段的尾下标
    """
    tmp = []
    i, j = low, mid+1
    while i <= mid and j <= high:
        if nums[i] <= nums[j]:
            tmp.append(nums[i])
            i += 1
        else:
            tmp.append(nums[j])
            j += 1
    if i <= mid:
        tmp.extend(nums[i:mid+1])
    if j <= high:
        tmp.extend(nums[j:high+1])
    nums[low:high+1] = tmp[:]


x = [1, 2, 34, -1, -9, 0, 2, 13]
MergeSort(x)
print(x)    # [-9, -1, 0, 1, 2, 2, 13, 34]

你可能感兴趣的:(Python归并排序)