zoukankan      html  css  js  c++  java
  • 归并排序之python

    想更好的了解归并排序, 需先了解, 将两个有序列表, 组成一个有序列表

    有两个列表  l1 = [1, 3, 5, 7]

                     l2 = [2, 4, 6]

     需要将 l1 和 l2 组成一个 有序大列表  l = [1, 2, 3, 4, 5, 6, 7]

      注意,前提 l1 和 l2 两个列表已经排好序, 是有序列表

     1 def merge(l1, l2):
     2     # 两个列表, 两个初始索引号, 赋值 0
     3     l1_index, l2_index = 0, 0
     4     # 存放结果的新的空列表
     5     result = []
     6     # 循环, 两个索引值都要小于各自列表的长度
     7     while l1_index < len(l1) and l2_index < len(l2):
     8         # 小的数值,则添加到结果列表中, 并把小列表 的索引+1,
     9         # 这样 小列表就指向下一个数据, 和 另一个列表的的数值再次比较
    10         if l1[l1_index] < l2[l2_index]:
    11             result.append(l1[l1_index])
    12             l1_index += 1
    13         else:
    14             result.append(l2[l2_index])
    15             l2_index += 1
    16 
    17     # l1 和 l2 长度可能相等, 也可能不等
    18     # 但是经过while循环后, l1_index 和 l2_index 
    19     # 最少有一个,已经到列表的末尾
    20     # 所以,如下对两个列表的最后切片取值,
    21     # 最少有一个是空列表, 
    22     # 直接列表相加, 就省去了判断代码逻辑
    23     result += l1[l1_index:]
    24     result += l2[l2_index:]
    25     return result
    26 
    27 
    28 print(merge([1, 3, 5, 7], [2, 4, 6]))

    归并排序的递归算法实现, 

    直接使用了上面代码的合并 merge 函数

     1 def mergesort(lists):
     2     # 如果列表长度小于等于1
     3     # 说明列表是空列表, 或只有一个元组
     4     # 则不需要排序,直接返回原列表
     5     if len(lists) <= 1:
     6         return lists
     7     # 列表长度除以2
     8     num = int(len(lists) / 2)
     9     # 将列表一分为二,
    10     # 再分别对这两个列表进行归并排序
    11     left = mergesort(lists[:num])
    12     right = mergesort(lists[num:])
    13     # 注意,这是递归算法
    14     # left 和 right 变成只有一个元素的列表值的时候
    15     # 或者, left 和 right 都已是有序列表
    16     # 调用merge函数
    17     # 可以打印, left 和 right 的值看看,
    18     # 感受, left 和 right 的变化
    19     # print(left, right)
    20     return merge(left, right)
    21 
    22 
    23 print(mergesort([3, 1, 4]))
    24 print(mergesort([3, 1, 4, 2]))

    归并排序,  将一个列表 一分为二, 分别对两个新列表进行归并排序, 然后 将这 两个排序后的新列表 进行 合并.

    两个被拆分的  新列表 再次进行归并排序, 直至递归到只有一个元素的情况,

    最后, 由最后的两个元素, 开始 合并, 逐层 向上 合并, 实现全部排序

    痛点: 是对递归算法的了解

      

  • 相关阅读:
    和大家分享下我的找工作历程。
    Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
    SGI STL空间配置器和内存池
    调试Release版本应用程序
    HawkNL 源码剖析
    C++:float 转型到 std::string 之总结。
    将一个数上调至2^n的倍数《参考STL源码》
    JavaScript中Ajax的使用
    jQuery之noConflict() 方法
    Linq to Object 的简单使用示例
  • 原文地址:https://www.cnblogs.com/golzn2018/p/9569452.html
Copyright © 2011-2022 走看看