二分法 氣泡排序 選擇排序

2021-10-12 07:02:06 字數 4792 閱讀 5771

二分法是一種效率比較高的搜尋方法

假設有乙個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 使用快速排序法對陣列進行排序的原理 陣列元素進行樹狀分支,分結點比較大小,然後採用遞迴函式遞迴處...