数据结构与算法--分治算法 Python实现分治算法 Python实现汉诺塔问题

分治算法的基本概念

  • 分治算法的介绍
    在这里插入图片描述
  • 分治算法可以求解的问题
    在这里插入图片描述
  • 分治算法的基本步骤
    在这里插入图片描述
    在这里插入图片描述
  • 分治算法的设计模式
    在这里插入图片描述

分治算法解决“汉诺塔”问题

  • 总体步骤分为:
    在这里插入图片描述
class HanoiTower(object):
    def hanoi_tower(self, num, a, b, c):
        # 如果只有一个盘
        if num == 1:
            print('第1个盘从' + a + '->' + c)
        else:
            # 如果我们有n>=2情况,我们总是可以看作是两个盘:最下面的一个盘 和 上面的所有盘
            # 1.先把 最上面的盘 A-> B
            self.hanoi_tower(num - 1, a, c, b)
            # 2.把最下边的盘 A->C
            print('第' + str(num) + '个盘从' + a + '->' + c)
            # 3.把B塔所有的盘从B->C,移动过程使用到 a 塔
            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 []
    # 递归的出口,当分解到长度是1 的时候
    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)  # 由于用到多次,length先保存
    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]
'''
发布了146 篇原创文章 · 获赞 37 · 访问量 7851

猜你喜欢

转载自blog.csdn.net/storyfull/article/details/103868331