python数据结构与算法——DAY1
汉诺塔问题(经典递归)
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数
'''汉诺塔问题'''
def hanoi(n,a,b,c):
if n>0:
hanoi(n-1, a, c, b)
print("moving from %s to %s" % (a, c))
hanoi(n-1, b, a, c)
hanoi(3,'A','B','C')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rMG9bD1-1653481077521)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220513181056613.png)]
二分查找
def binary_search(li, value):
left = 0
right = len(li) - 1
while left <= right:
mid = (left + right) // 2
if li[mid] == value:
return mid
if li[mid] > value:
right = mid - 1
else:
left = mid + 1
def main():
li = [1,32,1,31,41,231]
print(binary_search(li,1))
main()
改良的冒泡排序
def bubble_sort(li):
for i in range(len(li)-1):
exchange = False
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
exchange = True
if not exchange:
return
return li
def main():
li = [1,31,42,31,31,231]
print(bubble_sort(li))
main()
选择排序(简单以及改良版本)
def select_sort_simple(li):
li_new = []
for i in range(len(li)):
min_val = min(li)
li_new.append(min_val)
li.remove(min_val)
return li_new
def select_sort(li):
for i in range(len(li)-1):
min_loc = i
for j in range(i+1,len(li)-i-1):
if li[min_loc] > li[j]:
li[min_loc], li[j] = li[j], li[min_loc]
min_loc = j
return li
def main():
li = [1,31,42,31,31,231]
print(select_sort(li))
main()
插入排序
def insert_sort(li):
for i in range(1,len(li)):
tmp = li[i]
j = i - 1
while j > 0 and li[j] > tmp:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp
return li
def main():
li = [1,31,42,31,31,231]
print(insert_sort(li))
main()