Python实现合并排序(归并排序)(一文看懂)

欢迎关注公众号——《数据三分钟》

一线大厂的师兄师姐结合自己的工作实践,将数据知识浅显道来,每天三分钟,助你成为数据达人。还有面试指导和内推机会。

 

1、归并排序原理

     归并排序采用分而治之的原理:

     一、将一个序列从中间位置分成两个序列;

     二、在将这两个子序列按照第一步继续二分下去;

     三、直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。

 

2、一图以明之  

 

3、Python代码

 
def merge(a, b):
    c = []
    h = j = 0
    while j < len(a) and h < len(b):
        if a[j] < b[h]:
            c.append(a[j])
            j += 1
        else:
            c.append(b[h])
            h += 1

    if j == len(a):
        for i in b[h:]:
            c.append(i)
    else:
        for i in a[j:]:
            c.append(i)

    return c


def merge_sort(lists):
    if len(lists) <= 1:
        return lists
    middle = len(lists)//2
    left = merge_sort(lists[:middle])
    right = merge_sort(lists[middle:])
    return merge(left, right)


if __name__ == '__main__':
    a = [14, 2, 34, 43, 21, 19]
    print (merge_sort(a))
 

 

  • 55
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
以下是Python实现归并排序的代码和解释: ```python def merge_sort(arr): if len(arr) > 1: mid = len(arr) // 2 # 找到中间位置 left_half = arr[:mid] # 将列表分为左右两半 right_half = arr[mid:] merge_sort(left_half) # 递归调用merge_sort()函数 merge_sort(right_half) i = j = k = 0 # 初始化三个指针 # 将左右两个有序列表合并成一个有序列表 while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]: arr[k] = left_half[i] i += 1 else: arr[k] = right_half[j] j += 1 k += 1 # 将剩余的元素添加到列表末尾 while i < len(left_half): arr[k] = left_half[i] i += 1 k += 1 while j < len(right_half): arr[k] = right_half[j] j += 1 k += 1 # 测试代码 arr = [64, 34, 25, 12, 22, 11, 90] merge_sort(arr) print("排序后的列表:", arr) ``` 输出结果为:`排序后的列表: [11, 12, 22, 25, 34, 64, 90]` 代码解释: 1. `merge_sort()`函数接收一个列表作为参数,如果列表长度大于1,则将列表分为左右两半,然后递归调用`merge_sort()`函数对左右两个子列表进行排序。 2. `merge()`函数用于将两个有序列表合并成一个有序列表。在`merge_sort()`函数中,当左右两个子列表都排好序后,调用`merge()`函数将它们合并成一个有序列表。 3. 在`merge()`函数中,使用三个指针`i`、`j`、`k`分别指向左右两个子列表和合并后的列表。比较左右两个子列表的元素大小,将较小的元素添加到合并后的列表中,并将指针向后移动一位。当其中一个子列表的元素全部添加到合并后的列表中后,将另一个子列表的剩余元素添加到列表末尾。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值