排序---归并排序

 递归归并排序的思想是把列表分为两个子列表,单独排序子列表在进行合并列表

递归法可以利用二叉树进行理解,列表为根节点,子列表为子节点。

首先排序子列表,在一步步合并子列表,在合并两个子列表。

"""
简述归并排序的方法:  【32, 43, 22, 1, 5, 33, 8, 9】
第一步: 将列表分开两部分    32  43 22 1           5 33  8 9
第二步: 将左侧列表进行拆分   32 43     22 1                   5, 33     8, 9
第三步: 对比分开后的数据  进行初次排序    32 43   1  22       5  33   8 9
第四步: 取左侧列表的一个值  与右侧的两个值  分别对比  进行二次排序     1  22  32  43          5 8 9 33
第五步: 取第一个列表中的值   与第二个进行一次对比   1 5 8 9 22 32 33 43   排序完成
"""


def split_list(ali):
    n = len(ali)
    if n <= 1:
        return ali
    else:
        num = n // 2
        left = split_list(ali[:num])
        right = split_list(ali[num:])
    return merge_sort(left, right)


def merge_sort(left, right):
    l, r = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result


if __name__ == '__main__':
    ali = [2, 3, 1, 4, 7, 6, 5, 3, 12]
    print(split_list(ali))

 

迭代实现:

迭代的思想是:将列表元素全部分开,然后在进行迭代合并

def split_list(ali):
    # 将列表拆分成单个
    n = len(ali)
    num = 1
    while num < n:
        for i in range(0, n, num*2):
            left = ali[i:i+num]
            right = ali[i+num:i+num*2]
            sort_li = merge_sort(left, right, i)
        num *= 2
    return sort_li


def merge_sort(left, right, i):
    l, r = 0, 0
    j = i       # 列表添加的位置(下标)
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            ali[j] = left[l]
            l += 1
        else:
            ali[j] = right[r]
            r += 1
        j += 1
    # 如果l到头了  r没到头    r到头了 l没到头
    while l < len(left):
        ali[j] = left[l]
        l += 1
        j += 1
    while r < len(right):
        ali[j] = right[r]
        r += 1
        j += 1


if __name__ == '__main__':
    ali = [2, 3, 1, 4, 7, 6, 5, 3, 12]
    print(split_list(ali))
    print(ali)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值