核心:掐頭去尾取中間. 一次砍一半
二分查詢. 每次能夠排除掉一半的資料. 查詢的效率非常高. 但是侷限性比較大. 必須是有
序序列才可以使用二分查詢
兩種演算法: 常規迴圈, 遞迴迴圈
#使用二分法可以提高效率, 前提條件:有序序列
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
n = 88left =0
right = len(lst)-1
while left <= right: #
邊界, 當右邊比左邊還小的時候退出迴圈
mid = (left + right)//2 #
必須是整除. 因為索引沒有小數
if lst[mid] >n:
right = mid - 1
if lst[mid] left = mid + 1
if lst[mid] ==n:
print("
找到了這個數")
break
else
:
print("
沒有這個數
")
遞迴來完成二分法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]deffunc(n, left, right):
if left <= right: #
邊界print("哈哈"
) # 計算查詢了幾次
mid = (left + right)//2
if n >lst[mid]:
left = mid + 1
return func(n, left, right) #
遞迴 遞迴的入口
elif n right = mid - 1
#深坑. 函式的返回值返回給呼叫者
return func(n, left, right) #
遞迴elif n ==lst[mid]:
print("
找到了"
)
return
mid
#return # 通過return返回. 終止遞迴
else
:
print("
沒有這個數
") #
遞迴的出口
return -1 #
1, 索引+ 2, 什麼都不返回, none
#找66, 左邊界:0, 右邊界是:len(lst) - 1
ret = func(70, 0, len(lst) - 1)
print(ret) #
不是none
#時間複雜度最低, 空間複雜度最低, 只需找一次,缺點也明顯
lst1 = [5,6,7,8]
lst2 =[0,0,0,0,0,0,0,0,0]
for el in
lst1:
lst2[el] = 1
if lst2[4] == 1: #
o(1)
print('
找到了')
else
:
print("
沒找到")
顧名思義,氣泡排序直觀的意思是氣泡越大冒的越快:),對應到我們的列表中就是數字最大的先選出來,然後依次進行。例如 mylist = [1,4,5,0,6],比較方式為:
相鄰的兩個數字先進行比較,也就是mylist[0]和mylist[1],發現不是">"的關係,就繼續比較mylist[1]和mylist[2]。。。依次進行,發現mylist[2]>mylist[3](及5>0),就進行交換,所以走完第一次全列表比較得到新列表[1,4,0,5,6],然後每一次掃瞄得到的新列表如下:
第一次:[1,4,0,5,6]
第二次:[1,0,4,5,6]
第三次:[0,1,4,5,6]
第四次:[1,4,5,0,6]
1 defbubblesort(mylist):
2 #
首先獲取list的總長度,為之後的迴圈比較作準備
3 length =len(mylist)
4
5 #
一共進行幾輪列表比較,一共是(length-1)輪
6 for i in range(0,length-1):
7
8 #
每一輪的比較,注意range的變化,這裡需要進行length-1-長的比較,注意-i的意義(可以減少比較已經排好序的元素)
9 for j in range(0,length-1-i):
10
11 #
交換12 if mylist[j] > mylist[j+1]:
13 tmp =mylist[j]
14 mylist[j]=mylist[j+1]
15 mylist[j+1] =tmp
16
17 #
列印每一輪交換後的列表
18 for item in
mylist:
19 print
(item)
20 print("
*************************====")
21 22 print("
bubble sort: ")
23 mylist = [1,4,5,0,6]
24 bubblesort(mylist)
二分法和氣泡排序
先放乙個 可以看到冒泡,選擇,插入排序的過程 冒泡 選擇 插入排序 前言 二分法是乙個優化演算法,在乙個基於有序列表中,列表從1到10000,如果要找乙個8899的數字,不用二分法的話,就是迴圈從一到10000,直到找到8899.但是,有沒有想過,前5000個都比8899小,所以能不能直接第一次就判...
氣泡排序,二分法查詢
lst 18,8,16,2,5,7 通過交換的方式.把列表中最大的值一定到最右端 for abc in range len lst 控制內部移動的次數 n 0 while n len lst 1 if lst n lst n 1 lst n lst n 1 lst n 1 lst n n n 1 p...
氣泡排序法和二分法排序
使用氣泡排序法對陣列進行排序的原理 陣列元素兩兩比較大小 function func arr print r arr arr array 0,11,2,3,24,5,16,7,48,9 func arr 使用快速排序法對陣列進行排序的原理 陣列元素進行樹狀分支,分結點比較大小,然後採用遞迴函式遞迴處...