二分法是一種效率比較高的搜尋方法
假設有乙個1~100之間的數字,你來猜這個數是多少,每猜一次可以得到三種
回答:正確、大了或小了。
如何保證用最少的次數猜對?
很多人會想到先猜50,如果猜大了,說明答案比50小,然後猜25...用這種方法,每次都可以將數字的範圍縮小一半,
對於1~100之間的任何數,最多都只需要7次就能找到答案。
這種每次將搜尋範圍縮小一半的方法,就是二分法搜尋的思想。
**如下:
def func(alist, item):
low = 0
high = len(alist)-1
n = 0
while low <= high:
mid = int((low + high)/2)
n += 1
if alist[mid]==item:
return mid
if alist[mid]python 二分法搜尋遞迴實現
在實現**前,先分析二分法的前提條件:
1. 上面的例子在1~100中查詢乙個數字,每次都要判斷是大了還是小了,這裡隱含了乙個條件,即1~100是公升序排列的。對於二分法,資料列表必須是有序的,一般是公升序,降序也可以。
2. 跳出1~100的範圍,對於任何的資料集合,都可以使用二分法來搜尋其中的某個數。
現在來看一下二分法搜尋的具體過程。如在 [50, 77, 55, 29, 10, 30, 66, 18, 80, 51] 中搜尋 77 。
1. 對列表排序。通常的資料很少是排好序的,要使用二分法,就要先對資料列表進行排序。
2. 取一半位置的資料。對於乙個資料集合,資料量可能是奇數,也可能是偶數,但不管奇數偶數,都取2的整除。
所以這裡先找到一半位置的50
**如下:
def binnry_search(alist,item):
# 構造初始下標和結束下標
first = 0
last = len(alist)-1
# 構造迴圈比較條件
while first <= last:
# 構造中間值下標
mid = (first+last) // 2
# item (要查詢的元素) 和中間值下標對應的元素進行比較 查詢到後直接返回值
if item == alist[mid]:
# 返回查詢到的值
return true,alist.index(item)
else:
if item > alist[mid]:
first = mid + 1
else:
last = mid - 1
return false
if __name__ == '__main__':
a_list = [-22,-11,0,11,22,33,38,44,55,57,66,72,81,96,123456]
print(binnry_search(a_list,44))
通過迭代查詢中間值
def fun(alist,item):
if len(alist) == 0:
return false
else:
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))
氣泡排序
def func(alist):
for x in range(1,len(alist)): # x 就是 1 到 傳過來的這個引數的長度總值
for i in range(0,len(alist)-x): # i 就是 傳過來的列表長度 - 去 x
if alist[i] > alist[i+1]: # 如果下標i 小於i+1
alist[i], alist[i+1] = alist[i+1], alist[i] # 那麼 下標i 與 下標 i+1 互換位置
return alist # 返回排序後的列表
print(func([1,4,2,3,6,7,8,9,0,5])) # 輸出 func([1,4,2,3,6,7,8,9,0,5]) 這句話就是 向func函式中傳遞引數
選擇排序
def func(alist):
for x in range(0,len(alist)): # x 就是 1 到 傳過來的這個引數的長度總值
min_num = alist[x] # min_num就等於每次迴圈的下標對應數字
for i in range(x+1,len(alist)): # 迴圈下標x+1 到所有下標長度
if alist[i] > min_num: # 如果下標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])) # 向func函式傳遞引數
for迴圈:重複執行語句
for n in range(100,1000):
print(n)
a=[100,90,86,80,77];
for b in a:
print(b);
注意: b這個變數是在 for 迴圈中定義的,意思是,依次取出list中的每乙個元素,並把元素賦值給 name,然後執行for迴圈體(就是縮排的**塊)
求四個同學的平均成績 l = [75, 92, 59, 68]
l = [75, 92, 59, 68]
sum = 0.0
for x in l:
sum = sum + x
print (sum / 4)
print(sum/len(l))
三角形:
n=9
for i in range(n):
for j in range(i):
print(' ',end='')
for k in range(i,n):
print('$ ',end='')
print()
九九乘法表:
for i in range(1,10):
for n in range(1,i+1):
print('%s×%s=%s'%(m,n,m*n),end=' ')
print()
%s表示將引數格式化為字串
%d表示將引數格式化為整數
%.1f表示將引數格式化為帶有1位小數點的浮點數
while迴圈
python 程式設計中 while 語句用於迴圈執行程式,即在某條件下,迴圈執行某段程式,以處理需要重複處理的相同任務。其基本形式為:
while 判斷條件:
執行語句……
執行語句可以是單個語句或語句塊。判斷條件可以是任何表示式,任何非零、或非空(null)的值均為true。當判斷條件假false時,迴圈結束,while 迴圈不會迭代 list 或 tuple 的元素
要從 0 開始列印不大於 n 的整數:
n=100;
i=0;
while ibreak中斷迴圈
break語句用來終止迴圈語句,即迴圈條件沒有false條件或者序列還沒被完全遞迴完,也會停止執行迴圈語句。
break語句用在while和for迴圈中。
如果您使用巢狀迴圈,break語句將停止執行最深層的迴圈,並開始執行下一行**。
var = 10
while var > 0:
print(var)
var = var - 1
if var == 5: # 當變數 var 等於 5 時退出迴圈
break
continue跳過繼續執行
python continue 語句跳出本次迴圈,而break跳出整個迴圈。
continue 語句用來告訴python跳過當前迴圈的剩餘語句,然後繼續進行下一輪迴圈。
continue語句用在while和for迴圈中。
var = 10
while var > 0:
var = var -1
if var == 5:
continue
print(var)
巢狀迴圈
python 語言允許在乙個迴圈體裡面嵌入另乙個迴圈
for x in ['a', 'b', 'c']:
for y in ['1', '2', '3']:
print (x + y)
氣泡排序 二分法
核心 掐頭去尾取中間.一次砍一半 二分查詢.每次能夠排除掉一半的資料.查詢的效率非常高.但是侷限性比較大.必須是有 序序列才可以使用二分查詢 兩種演算法 常規迴圈,遞迴迴圈 使用二分法可以提高效率,前提條件 有序序列 lst 22,33,44,55,66,77,88,99,101 238 345 4...
陣列排序(冒泡 選擇 二分法)
氣泡排序 package day0310 public class bubblesortdemo bubblesort array for int i 0 i array.length i public static void bubblesort int array 選擇排序 package da...
氣泡排序法和二分法排序
使用氣泡排序法對陣列進行排序的原理 陣列元素兩兩比較大小 function func arr print r arr arr array 0,11,2,3,24,5,16,7,48,9 func arr 使用快速排序法對陣列進行排序的原理 陣列元素進行樹狀分支,分結點比較大小,然後採用遞迴函式遞迴處...