zoukankan      html  css  js  c++  java
  • 大话算法-排序-归并排序

    归并排序是将两个已经排序的序列合并成一个序列的操作
      1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
      2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
      3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
      4、重复步骤3直到某一指针到达序列尾
      5、将另一序列剩下的所有元素直接复制到合并序列尾

    def merge_sort(data):
        #不断递归调用自己一直到拆分成成单个元素的时候就返回这个元素,不再拆分了
        if len(data) == 1:
            return data
    
        #取拆分的中间位置
        # mid = len(data) // 2
        mid = len(data) >> 1
        #拆分过后左右两侧子串
        left = data[:mid]
        right = data[mid:]
    
        #对拆分过后的左右再拆分 一直到只有一个元素为止
        #最后一次递归时候ll和lr都会接到一个元素的列表
        # 最后一次递归之前的ll和rl会接收到排好序的子序列
        ll = merge_sort(left)
        rl =merge_sort(right)
    
        # 我们对返回的两个拆分结果进行排序后合并再返回正确顺序的子列表
        # 这里我们调用拎一个函数帮助我们按顺序合并ll和lr
    
        return merge(ll, rl)
    
    #这里接收两个列表
    def merge(left, right):
        # 从两个有顺序的列表里边依次取数据比较后放入result
        # 每次我们分别拿出两个列表中最小的数比较,把较小的放入result
        result = []
        while len(left) > 0 and len(right) > 0 :
            #为了保持稳定性,当遇到相等的时候优先把左侧的数放进结果列表,因为left本来也是大数列中比较靠左的
            if left[0] <= right[0]:
                result.append(left.pop(0))
            else:
                result.append(right.pop(0))
        #while循环出来之后 说明其中一个数组没有数据了,我们把另一个数组添加到结果数组后面
        if left:
            result += left
        if right:
            result += right
    
        return result
    
    if __name__ == '__main__':
        li = [5, 0, 8, 4, 3, 1, 3, 6, 2, 4]
        li2 = merge_sort(li)
        print(li2)
  • 相关阅读:
    设计模式复习【1】- 设计原则
    Java8的学习笔记
    Gson关于抽象类的序列化与反序列化
    关于一个Java web与JFrame的深度结合
    《重构》笔记
    JAVA8 Stream API总结的好的文章 —— 持续更
    Spring Boot引入Thymeleaf前端框架的诸多问题
    敏捷开发:原则,模式与实践——第8章 单一职责原则SRP
    maven 你应该懂得那些事
    redis之单机和主从环境搭建
  • 原文地址:https://www.cnblogs.com/imlifelong/p/10808014.html
Copyright © 2011-2022 走看看