归并排序

首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。

两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后 移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面。

由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN。

def merge(list1, list2):
    tmp = []
    i = 0
    j = 0
    while i < len(list1) and j < len(list2):
        if list1[i] < list2[j]:
            tmp.append(list1[i])
            i += 1
        else:
            tmp.append(list2[j])
            j += 1

    if i == len(list1):
        for t in list2[j:]:
            tmp.append(t)
    else:
        for t in list1[i:]:
            tmp.append(t)
    return tmp

def merge_sort(list):
    if len(list) < 2:
        return list
    mid = int(len(list) / 2)
    left = merge_sort(list[:mid])
    right = merge_sort(list[mid:])
    return merge(left, right)



if __name__ == '__main__':
    list = [32, 13, 28, 5, 23, 56, 12, 78, 34, 1, 67, 4]
    result = merge_sort(list)
    print(result)
原文地址:https://www.cnblogs.com/fredkeke/p/9453889.html