zoukankan      html  css  js  c++  java
  • 排序系列03--归并排序

    在谈归并排序之前,我们先讨论下分治法

      分治法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解(来自百度 233333)

         分治法的核心就是把大问题拆分成小问题。一个属于领导的算法。。。

    归并排序:将问题分成多个 然后解决后合并

    def MergeSort(lists):
        if len(lists) <= 1:
            return lists
        num = int( len(lists)/2 )
        left = MergeSort(lists[:num])
        right = MergeSort(lists[num:])
        return Merge(left, right)
    def Merge(left,right):
        r, l=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 += right[r:]
        result+= left[l:]
        return result
    

      说白了归并排序分成两步,拆分和合并

    合并:我们想象有两个有序的数组 我们如何把他们排序呢 [1,3,5,6] ,[2,4,9,10] 过程应该是 1-2比较 2-3比较 3-5。。。。 这样复杂度就是O(n)

    拆分:1 -2 -4-8  我们知道这里的问题每次都会随着迭代次数/2 所以这里的复杂度是O(log n)

    因此归并排序的复杂度为 O(n log n) 

  • 相关阅读:
    流程控制之while循环
    流程控制之case语句
    流程控制之if判断
    元字符
    基本数据类型与值操作
    变量
    shell 基础
    node系列---【node连接数据库步骤解析】
    node系列--【 DML语句对数据库的增删改查】
    node系列--【express生成器安装及第三方中间件安装】
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/5635634.html
Copyright © 2011-2022 走看看