# 汉诺塔问题defhanoi(n, a, b, c):if n >0:
hanoi(n -1, a, c, b)print('Move from %s to %s'%(a, c))
hanoi(n -1, b, a, c)
hanoi(3,'A','B','C')
顺序查找
"""
顺序查找
""""""
时间复杂度:O(n)
python内置的 列表查询函数 index() 就是顺序查找 -------------> 因为二分查找的前提是有序列表
而排序的时间复杂段往往要大于查找,所以就要考虑了
如果是要进行大量的查找,那么先排序可能会更好
"""deflinear_search(li, val):for i, v inenumerate(li):if v == val:return i
else:returnNone
ret = linear_search([1,2,3,4],10)print(ret)
二分查找
"""
二分查找
时间复杂度:O(logN)
""""""
时间复杂度:O(logN)
当计算时间复杂度时,一旦有 循环减半 一般会有 logN
"""defbinary_search(li, val):
left =0
right =len(li)-1while left < right:
mid =(left + right)//2if li[mid]== val:return mid
elif li[mid]> val:
right = mid -1else:
left = mid +1else:returnNone
ret = binary_search([1,2,3,4,5,6,7,8,9],3)print(ret)
冒泡排序
"""
冒泡排序
"""import random
"""
时间复杂度: O(n*n)
"""defbubble_sort(li):for i inrange(len(li)-1):# 一共循环几次
exchange =Falsefor j inrange(len(li)- i -1):# 每次循环比较几次if li[j]> li[j +1]:
li[j], li[j +1]= li[j +1], li[j]
exchange =Trueifnot exchange:# 判断是否已经排序完成return
li =[random.randint(0,10000)for i inrange(10)]print(li)
bubble_sort(li)print(li)
选择排序
"""
选择排序
"""import random
defselect_sort_simple(li):"""
时间复杂度: O(n*n)
"""
new_li =[]for i inrange(len(li)):
min_num =min(li)# min函数本身就是一个 O(n) 的操作
new_li.append(min_num)
li.remove(min_num)# remove操作本身就是一个 O(n) 的操作return new_li
defselect_sort(li):"""
时间复杂度: O(n*n)
"""for i inrange(len(li)-1):# i是第几趟
min_loc = i
for j inrange(i,len(li)):if li[j]< li[min_loc]:
min_loc = j
li[i], li[min_loc]= li[min_loc], li[i]
li =[random.randint(0,10000)for i inrange(10)]print(li)print(li)
插入排序
"""
插入排序
"""import random
"""
每次在 未排序区 中拿一个,在 已排序区 中插入
第一次默认已经拿了一个
时间复杂度 : O(n*n)
"""definsert_sort(li):for i inrange(1,len(li)):# i:本次摸到牌的下标
tem = li[i]
j = i -1# 已经在排序区的最大的值的下标while j >=0and li[j]> tem:
li[j +1]= li[j]
j -=1
li[j +1]= tem
print(li)
li =[random.randint(0,100)for i inrange(6)]print(li)
insert_sort(li)print(li)