Python 归并排序算法

归并算法理解

假设有一个序列:
merge_sort: 54 26 93 17 77 31 44 55

对半拆分,拆到每个部分的都只有一个元素:

54 26 93 17 | 77 31 44 55

54 26 | 93 17 | 77 31 | 44 55

54 | 26 | 93 | 17 | 77 |31 | 44 | 55

进行合并。合并后小的在前,大的在后

26 54 | 17 93 | 31 77 | 44 55

26 54 | 17 93 | 31 77 | 44 55

26 54 | 17 93

然后检查左右两边,分别从左往右比较,先比较26和17,17小就将17放在第一个位置,然后把指针指向93,比较26和93, 26小就将26放在第二个位置,把左侧的指针后移指向54,然后比较54和93,54小就将54放在第三个位置,93放在第四个位置。得到排序后的结果。

17 26 54 93 | 31 44 55 77

合并后再重复上个步骤

17 26 31 44 54 55 77 93

代码实现


def merge_sort(alist):
    n = len(alist)
    if n<=1:
        return alist

    mid = n//2

    left_lst = merge_sort(alist[:mid])
    right_lst = merge_sort(alist[mid:])


    left_pointer, right_pointer = 0, 0
    result = []
    
    
    while left_pointer < len(left_pointer) and right_pointer < len(right_pointer):
        
        if left_lst[left_pointer] < right_lst[right_pointer]:
            result.append(left_lst[left_pointer])
            left_pointer += 1
        else:
            result.append(left_lst[right_pointer])
            right_pointer += 1
            
    result += left_lst[left_pointer:]
    result += right_lst[right_pointer:]
    
    return result
    

时间复杂度

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值