排序系列03--归并排序

Posted nerdlerss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序系列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) 

以上是关于排序系列03--归并排序的主要内容,如果未能解决你的问题,请参考以下文章

归并排序和快速排序(算法系列)

图解算法系列之归并排序

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现

排序算法系列:归并排序算法

排序算法系列:归并排序算法

排序算法系列之归并算法