数据结构_算法--归并排序

归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

def merge_sort(alist):
    """归并排序"""

    n = len(alist)

    # 递归退出的条件
    if 1 == n:
        return alist

    # 二分分解
    mid = n // 2

    # 对左半部分进行归并排序
    left_sorted_li = merge_sort(alist[:mid])

    # 对右半部分进行归并排序
    right_sorted_li = merge_sort(alist[mid:])

    # 合并两个有序集合
    left, right = 0, 0  # left与right的下标指针
    merge_sorted_li = []

    left_n = len(left_sorted_li)
    right_n = len(right_sorted_li)
    while left < left_n and right < right_n:
        if left_sorted_li[left] <= right_sorted_li[right]:
            merge_sorted_li.append(left_sorted_li[left])
            left += 1
        else:
            merge_sorted_li.append(right_sorted_li[right])
            right += 1

    merge_sorted_li += left_sorted_li[left:]
    merge_sorted_li += right_sorted_li[right:]
    return merge_sorted_li


if __name__ == '__main__':
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print("befor sort: %s" % li)

    sorted_alist = merge_sort(li)
    print("after sort: %s" % li)

    print("new   sort: %s" % sorted_alist)

时间复杂度
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
稳定性:稳定

猜你喜欢

转载自blog.csdn.net/weixin_44786482/article/details/88946515