归并排序递归版

def merge(array, start, mid, end):
    res = []
    left1 = start
    left2 = mid + 1
    while left1 <= mid and left2 <= end:
        if array[left1] <= array[left2]:
            res.append(array[left1])
            left1 += 1
        else:
            res.append(array[left2])
            left2 += 1
    if left1 <= mid:
        res.extend(array[left1:mid + 1])
    if left2 <= end:
        res.extend(array[left2:end])
    for i in range(res.__len__()):
        array[start + i] = res[i]


def mergeSort(array, start, end):
    if start >= end:
        return
    mid = (start + end) // 2
    mergeSort(array, start, mid)
    mergeSort(array, mid + 1, end)
    merge(array, start, mid, end)


if __name__ == '__main__':
    l = [1, 5, 7, 2, 3, 6, 9]

    start = 0
    end = l.__len__() - 1
    mergeSort(l, start, end)
    print(l)

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

归并排序相当于二叉树的后续遍历,先左右 后头结点。归并排序一定需要一个新的空间去存储排序好的元素,然后将临时空间里面的元素重新放回原数组里面进行merge。

归并排序的迭代的移动依靠的是mid的变化来推动。

posted @ 2020-09-03 09:34  pie神  阅读(284)  评论(0编辑  收藏  举报