分治算法的基本概念
- 分治算法的介绍
- 分治算法可以求解的问题
- 分治算法的基本步骤
- 分治算法的设计模式
分治算法解决“汉诺塔”问题
- 总体步骤分为:
class HanoiTower(object):
def hanoi_tower(self, num, a, b, c):
if num == 1:
print('第1个盘从' + a + '->' + c)
else:
self.hanoi_tower(num - 1, a, c, b)
print('第' + str(num) + '个盘从' + a + '->' + c)
self.hanoi_tower(num - 1, b, a, c)
if __name__ == '__main__':
t = HanoiTower()
t.hanoi_tower(5, "A", 'B', "C")
'''
第1个盘从A->C
第2个盘从A->B
第1个盘从C->B
第3个盘从A->C
第1个盘从B->A
第2个盘从B->C
第1个盘从A->C
第4个盘从A->B
第1个盘从C->B
第2个盘从C->A
第1个盘从B->A
第3个盘从C->B
第1个盘从A->C
第2个盘从A->B
第1个盘从C->B
第5个盘从A->C
第1个盘从B->A
第2个盘从B->C
第1个盘从A->C
第3个盘从B->A
第1个盘从C->B
第2个盘从C->A
第1个盘从B->A
第4个盘从B->C
第1个盘从A->C
第2个盘从A->B
第1个盘从C->B
第3个盘从A->C
第1个盘从B->A
第2个盘从B->C
第1个盘从A->C
'''
归并排序
def merge_sort(li):
if len(li) < 1:
return []
if len(li) == 1:
return li
mid_index = len(li) >> 1
sort_left_li = merge_sort(li[:mid_index])
sort_right_li = merge_sort(li[mid_index:])
return merge_core(sort_left_li, sort_right_li)
def merge_core(left_li, right_li):
left_index = 0
right_index = 0
left_len = len(left_li)
right_len = len(right_li)
ret_list = []
while left_index < left_len and right_index < right_len:
if left_li[left_index] < right_li[right_index]:
ret_list.append(left_li[left_index])
left_index += 1
else:
ret_list.append(right_li[right_index])
right_index += 1
if left_index < left_len:
while left_index < left_len:
ret_list.append(left_li[left_index])
left_index += 1
if right_index < right_len:
while right_index < right_len:
ret_list.append(right_li[right_index])
right_index += 1
return ret_list
if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
sort_list = merge_sort(li)
print(sort_list)
'''输出结果
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]
'''