分割統治法とマージソート
マージは、
分割統治法のより古典的なアプリケーションです。分割統治法の3つのステップ
- 元の問題をいくつかのサブ問題に分解します。これらのサブ問題は元の問題の最小の例です。
- これらのサブ問題を解決し、サブ問題を再帰的に解決します。ファイルの問題の規模は、直接解決できるほど小さいです。
- これらのサブ問題の解決策とソース問題の解決策を組み合わせます
。マージソート方法、3つのステップ:分解、解決、およびマージ
時間計算量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