归并排序

1.1分治算法的概述

1.分解:把一个问题分解为多个子问题,这些子问题是更小实例上的原问题。
2.解决:递归求解子问题,当问题足够小时,按照基础情况求解。
3.合并:把子问题的解合并成原问题的解。

 

1.2有序数列的合并

首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

 

1.3步骤

1.4程序实现

 

class MergeSort:
    def sort(self,li):
     """递归调用""" if len(li)==1: return li mid = len(li)//2 left = li[:mid] right = li[mid:] l1 = self.sort(left) r1 = self.sort(right) return self.merge(l1,r1) def merge(self,array1,array2):
     """合并列表""" new_array = [] while array1!=[] and array2!=[]: n = array1[0] m = array2[0] if n<m: new_array.append(n) array1.remove(n)# array1.pop(0) else: new_array.append(m) array2.remove(m)#array2.pop(0) #print(new_array) if array1 == []: new_array.extend(array2) else: new_array.extend(array1) return new_array if __name__ == "__main__": array = [3,2,5,7,4,6,9] m = MergeSort() m.sort(array) >>>[2, 3, 4, 5, 6, 7, 9]

时间复杂度: 最好最坏都是 O( n log n )
稳定性:稳定
缺点:每次拆分数组都要开辟新的数组, 每次合并数组都要开辟新数组,空间复杂度很大

posted @ 2018-04-07 10:12  家迪的家  阅读(136)  评论(0编辑  收藏  举报