分治法与归并排序
归并是分治法比较经典的应用
分治法的三步骤
- 分解原问题成若干子问题,这些子问题是原问题最小的实例
- 解决这些子问题,递归的求解子问题,档子问题的规模足够小可以直接求解
- 合并这些子问题的解,成源问题的解
归并排序法,三步:分解,解决,合并
时间复杂度T(n)
#归并排序
def merge_sort(seq):
#判断数组的长度是不是还可以再分
if len(seq) <= 1:
return seq
else:
#数组二分之一的长度
mid = int(len(seq) / 2)
#从头开始到中间结束 ,调用自己传入二分之一个数组
left_half = merge_sort(seq[:mid])
#从中间开始到最后结束,调用自己传入二分之一个数组
right_half = merge_sort(seq[mid:])
#合并两个有序数组
new_seq = merge_sorted_list(left_half,right_half)
return new_seq
#合并数组的实现方法 , 传入分好的数组
def merge_sorted_list(sorted_a,sorted_b):
#把数组分别赋值给len_a,len_b
length_a,length_b = len(sorted_a),len(sorted_b)
a = b = 0#定义变量
#定义一个新的集合
new_sorted_seq = list()
#当两个集合长度都大于0
while a<length_a and b < length_b:
#比较它们之间的第一个值
if sorted_a[a] < sorted_b[b]:
#a小于b就把a赋值给新的集合
new_sorted_seq.append(sorted_a[a])
#len_a下标加一
a += 1
else:
#b小于a就把b赋值给新的数组
new_sorted_seq.append(sorted_b[b])
#len_b的下标加一
b += 1
#如果a中还有数据就
while a < length_a:
#就赋值给新的集合
new_sorted_seq.append(sorted_a[a])
#下标加一
a += 1
# 如果b中还有数据就
while b < length_b:
# 就赋值给新的集合
new_sorted_seq.append(sorted_b[b])
# 下标加一
b += 1
#返回排的集合
return new_sorted_seq