python 演算法歸類
阿新 • • 發佈:2020-12-15
1.斐波那契數列
def func(n): a = 0 b = 1 alist = [] if n <= 2: alist.append(a) alist.append(b) return alist else: for i in range(n): alist.append(a) a, b = b, a + b return alist
2.二分法
def func(alist, item): low = 0 high= len(alist)-1 print(type(low)) n = 0 # 記錄查詢幾次查到 while low <= high: # 迴圈的次數小於或者等於high的時候停止迴圈 mid = int((low + high)/2) n += 1 # 沒查詢一次 查詢次數+1 if alist[mid]==item: # 比對中間值是否等於要查詢的引數 return mid # 如果是 直接返回值 if alist[mid]<item: # 判斷如果中間值小於要查詢得數low = mid + 1 #那麼迴圈開始的數low 就等於 中間值+1 else: high = (mid-1) # 如果大於 就把中間值數的下標-1 縮小查詢範圍 return None #如果什麼都沒有查到 返回None print(func([1,2,33,4,58,9,11,12,19,18,89,20,28],28)) # 輸出查詢到的值
二分法 迭代查詢
def fun(alist,item): if len(alist) == 0: return Falseelse: mid = len(alist) // 2 #獲取中間值的下標 if item == alist[mid]: return True,item elif item < alist[mid]: # 如果查詢的數小於中間值 return fun(alist[:mid],item) #從開頭到中間值查詢 [:mid]是中間值66往前得數 else: return fun(alist[mid+1:],item) # 否則從中間值下一個數到結尾 # 輸出返回的值 print(fun([1, 22,33,44,55,66,77,88,99],66))
3.等邊三角形
for i in range(1,6): for j in range(1,6-i): print(" ",end="") for k in range(1,i+1): print("* ",end="") print("")
等邊三角形二
for i in range(1,6): for j in range(1,6-i): print(" ",end="") print("* "*i)
4.直角三角形
for i in range(6): i += 1 for j in range(i): print('*', end='')#end=‘'輸出空格 print()
5.氣泡排序
def func(alist): for x in range(1,len(alist)): for i in range(0,len(alist)-x): if alist[i] > alist[i+1]: alist[i], alist[i+1] = alist[i+1], alist[i] return alist print(func([1,4,2,3,6,7,8,9,0,5]))
6.選擇排序
def func(alist): for x in range(0,len(alist)): min_num = alist[x] for i in range(x+1,len(alist)): if alist[i] < min_num: alist[i], min_num = min_num, alist[i] alist[x] = min_num return alist print(func([1,4,2,3,6,7,8,9,0,5]))
7.連結串列
class Node: def __init__(self, initdata): self.__data = initdata self.__next = None def getData(self): return self.__data def getNext(self): return self.__next def setData(self, newdata): self.__data = newdata def setNext(self, newnext): self.__next = newnext class SinCycLinkedlist: def __init__(self): self.head = Node(None) self.head.setNext(self.head) def add(self, item): temp = Node(item) temp.setNext(self.head.getNext()) self.head.setNext(temp) def remove(self, item): prev = self.head while prev.getNext() != self.head: cur = prev.getNext() if cur.getData() == item: prev.setNext(cur.getNext()) prev = prev.getNext() def search(self, item): cur = self.head.getNext() while cur != self.head: if cur.getData() == item: return True cur = cur.getNext() return False def empty(self): return self.head.getNext() == self.head def size(self): count = 0 cur = self.head.getNext() while cur != self.head: count += 1 cur = cur.getNext() return count if __name__ == '__main__': s = SinCycLinkedlist() print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size())) s.add(19) s.add(86) print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size())) print('86 is%s in s' % ('' if s.search(86) else ' not',)) print('4 is%s in s' % ('' if s.search(4) else ' not',)) print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size())) s.remove(19) print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))
8.青蛙跳臺階:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
#! /usr/bin/env python # -*- coding: utf-8 -*- def quick(list): if len(list) < 2: return list tmp = list[0] # 臨時變數 可以取隨機值 left = [x for x in list[1:] if x <= tmp] # 左列表 right = [x for x in list[1:] if x > tmp] # 右列表 return quick(left) + [tmp] + quick(right) li = [4,3,7,5,8,2] print quick(li) # [2, 3, 4, 5, 7, 8] #### 對[4,3,7,5,8,2]排序 ''' [3, 2] + [4] + [7, 5, 8] # tmp = [4] [2] + [3] + [4] + [7, 5, 8] # tmp = [3] 此時對[3, 2]這個列表進行排序 [2] + [3] + [4] + [5] + [7] + [8] # tmp = [7] 此時對[7, 5, 8]這個列表進行排序 '''