归并排序之python

归并排序( Merge sort)

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

1.算法描述:

  • 分而治之
  • 分 :
    •   递归地拆分数组,直到它被分成两对单个元素数组为止.
    •   然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并, 直到整个列表按照排序顺序合并为止.
  • 治 :
    •   将2个排序列表合并为另一个排序列表是很简单的.
    •   简单地通过比较每个列表的头,删除最小的,以加入新排序的列表. 
    •   O(n) 操作

2.算法属性:

  • 稳定
  • 算法时间复杂度:O(nlogn)

3.代码实现

#算法时间复杂度 O(logN)
#递归
#两个步骤:1.拆分 2.合并

def _merge(a: list, b: list) -> list:
    #合并两个排序表
    c = []
    while len(a) > 0 and len(b) > 0:
        if a[0] < b[0]:
            c.append(a[0])
            a.remove(a[0])
        else:
            c.append(b[0])
            b.remove(b[0])

    if len(a) == 0:
        c += b
    else:
        c += a
    return c


def _merge_sorted(nums: list) -> list:
    # Won't sort in place
    if len(nums) <= 1:
        return nums

    m = len(nums) // 2
    a = _merge_sorted(nums[:m])     #前半
    b = _merge_sorted(nums[m:])   #后半
    return _merge(a, b)


# Wrapper包装器
def merge_sorted(nums: list, reverse=False) -> list:
    import time
    start = time.time()
    #归并排序
    nums = _merge_sorted(nums)
    if reverse:
        nums = nums[::-1]

    t = time.time() - start
    return nums, len(nums), t

lis = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
merge_sorted(l, reverse=False)[0]

#输出结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

猜你喜欢

转载自www.cnblogs.com/kumata/p/9123492.html