排序系列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--归并排序的主要内容,如果未能解决你的问题,请参考以下文章