Loading

13-归并排序-分治策略应用于排序

# 归并排序是递归算法,思路是将数据表持续分裂为两半,对两半分别进行归并排序
# 递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的
# 缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一;
# 用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表
# 将归并排序分为两个过程来分析:分裂 和归并
# 分裂的过程,借鉴二分查找中的分析结果,是对数复杂度,时间复杂度为O(logn)
# 归并的过程,相对于分裂的每个部分,其所有数据项都会被比较和放置一次,所以是线性复杂度,其时间复杂度是O(n)
# 综合考虑,每次分裂的部分都进行一次O(n)的数据项归并,总的时间复杂度是O(nlogn)


def merge_sort(alist):
    # 递归结束条件
    if len(alist) <= 1:
        return alist
    # 分解问题并递归调用
    middle = len(alist) // 2
    left = merge_sort(alist[:middle])
    right = merge_sort(alist[middle:])
    # 合并左右,完成排序
    merged = []
    while left and right:
        if left[0] <= right[0]:
            merged.append(left.pop(0))
        else:
            merged.append(right.pop(0))
    merged.extend(right if right else left)
    return merged  # 注意递归有返回值,返回的是排好序的列表


testlist = [2, 3, 3, 243, 24, 24455, 23]
print(merge_sort(testlist))
posted @ 2020-11-13 13:09  lotuslaw  阅读(90)  评论(0编辑  收藏  举报