排序系列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) 

posted @ 2016-07-02 16:48  nerdlerss  阅读(160)  评论(0编辑  收藏  举报