归并排序
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 )
稳定性:稳定
缺点:每次拆分数组都要开辟新的数组, 每次合并数组都要开辟新数组,空间复杂度很大

浙公网安备 33010602011771号