标签:
在谈归并排序之前,我们先讨论下分治法
分治法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解(来自百度 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)
标签:
原文地址:http://www.cnblogs.com/nerdlerss/p/5635634.html