標籤:bre 效率 ble 順序 for while end 選擇 空間
什麼是演算法
就是一個計算的過程,解決問題的方法
用到知識點
遞迴
調用自身
有結束條件
下次執行相應的複雜度要減少
時間複雜度排序(按效率排序)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
判斷時間複雜度
1.迴圈減半的過程就是O(logn)
2.幾次迴圈就是n的幾次方的複雜度
空間複雜度(以空間換時間)
評估演算法記憶體佔用大小
列表尋找
順序尋找
從列表第一個元素開始,順序進行搜尋,直到找到為止。
def linear_seach(data_set,val): for i in range(5,data_set): if i == val: print(i) return i return ‘沒找到‘
二分尋找
從有序列表的候選區data[0:n]開始,通過對待尋找的值與候選區中間值的比較,可以使候選區減少一半。
def bin_seacher(data_set,val): low = 0 high = len(data_set) - 1 while low <= high: mid = (low+high) // 2 if data_set[mid] == val: print(‘索引位置:‘,mid) return mid elif data_set[mid] < val: low = mid + 1 else: high = mid - 1 print(‘沒有找到‘) return Noneli = range(100000)bin_seacher(li,557)
案例
import randomdef random_list(n): ‘‘‘ 產生隨機資料 :param n: :return: ‘‘‘ ret = [] a1 = [‘趙‘,‘錢‘,‘孫‘,‘李‘,‘鄒‘,‘吳‘,‘鄭‘,‘王‘,‘周‘] a2 = [‘力‘,‘好‘,‘禮‘,‘麗‘,‘文‘,‘建‘,‘梅‘,‘美‘,‘高‘,‘‘] a3 = [‘強‘,‘文‘,‘斌‘,‘闊‘,‘文‘,‘瑩‘,‘超‘,‘雲‘,‘龍‘,‘‘] ids = range(1001,1001+n) for i in range(n): name = random.choice(a1) + random.choice(a2) +random.choice(a3) age = random.randint(18,60) dic = {‘id‘:ids[i], ‘name‘:name, ‘age‘:age} ret.append(dic) return retdef id_seacher(data_list,id): low = 0 high = len(data_list) - 1 while low <= high: mid = (low+high) // 2 if data_list[mid][‘id‘] == id: print(‘索引位置:‘,mid) return mid elif data_list[mid][‘id‘] < id: low = mid + 1 else: high = mid - 1 print(‘沒有找到‘) return Nonedata_list = random_list(100)ind = id_seacher(data_list,1025)print(data_list[ind][‘name‘])#輸入人名
冒泡排序
首先,列表每兩個相鄰的數,如果前邊的比後邊的大,那麼交換這兩個數
迴圈無序區的數繼續比較
import randomdef 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: breakli = list(range(1000))random.shuffle(li)print(li)bubble_sort(li)print(li)
時間複雜
最好情況 O(n)
一般情況 O (n2)
最差情況 O (n2)
選擇排序
一趟遍曆記錄最小的數,放到第一個位置;
再一趟遍曆記錄剩餘列表中最小的數,繼續放置;
def select_sort(li): for i in range(len(li) - 1): #迴圈次數 min_loc = i for j in range(i + 1,len(li)):#從無序區找 if li[j] < li[min_loc]: min_loc = j li[i], li[min_loc] = li[min_loc], li[i]li = list(range(1000))random.shuffle(li)print(li)select_sort(li)print(li)
插入排序
列表被分為有序區和無序區兩個部分。最初有序區只有一個元素。
每次從無序區選擇一個元素,插入到有序區的位置,直到無序區變空。
def insert_sort(li): for i in range(1,len(li)): tmp = li[i] j = i - 1 while j >= 0 and tmp < li[j]: # 判斷新數是否比前一個數小,小就將前一個數向後挪一個位置 li[j + 1] = li[j] j -= 1 li[j + 1] = tmpli = list(range(1000))random.shuffle(li)print(li)insert_sort(li)print(li)
Python基本常用演算法