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) 

  • 相关阅读:
    zabbix(三)网页操作
    zabbix(二)安装客户端
    zabbix(一)安装服务端
    python操作git
    elasticsearch之match
    elasticsearch之查询的两种方式
    Git 命令集合啦
    Django contenttype 组件
    Django 中 related_name/related_query_name 的区别
    Django中的CharField 和 FileField 主要讲FileField
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/5635634.html
Copyright © 2011-2022 走看看