Python 關於使用二分查詢的練習

2021-08-20 00:24:46 字數 2034 閱讀 8653

python 關於使用二分查詢的練習

說明:

使用二分解決查詢有乙個前提,必須是有序的。

下面的習題有幾種解法,傳統方法查詢效率低,這裡用二分就是為了提高查詢效率。

題目:

有乙個無序的序列list_c = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51], 請先排序並列印輸出。

分別嘗試插入[20,40,41,100]到序列中合適的位置,保證其有序。

【方法1:傳統方法】

list_c = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]

list_s = [20, 40, 41, 100]

order_list = sorted(list_c)

print(order_list)

# 下面**能解決正確插入列表最後索引的值為100的數字.

for x in list_s:

for i, v in enumerate(order_list):

if v > x:

order_list.insert(i, x)

break

if v < x and i == len(order_list) - 1: #這裡是判斷插入的數值是不是大於在列表最後乙個索引的數值

print(order_list)

執行結果:

[25, 37, 40, 40, 47, 48, 51, 73, 99, 99]

[20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]

【方法2:二分方法】

list_c = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51,99]

list_s = [20, 40, 41, 100]

order_list = sorted(list_c)

print(order_list)

ret = order_list[:] #淺複製,保留原來資料。

def insert_sort(ret, num):

low = 0 # 索引起點

high = len(ret) # 索引終點

while low < high: # 起點索引大於或等於列表最後乙個元素的索引,條件無法進入。

mid = (low + high) // 2 # 取列表中間點的索引

if num < ret[mid]: # 條件判斷,如果待插入列表的值小於有序列表對應mid索引的值,就向左查詢,

high = mid # 同時確認這個中間點mid索引就是ret列表的high最高索引。

else: # 如果待插入列表的值大於有序列表對應mid索引的值,就向右查詢,求中點

low = mid + 1 # 同時確認這個中間點mid索引就是ret列表的開始索引low的值。

return low # 這個開始索引low就是最終計算出來的待插入索引的位置low,所以返回low。

for num in list_s: # 迴圈去取待插入列表的元素。

index = insert_sort(ret, num) # 呼叫上面的函式取出插入元素索引值。

ret.insert(index, num) # 就地插入對應索引的值到列表ret中.

print(ret) # 列印插入元素後的列表

執行結果:

[25, 37, 40, 40, 47, 48, 51, 73, 99, 99, 99]

[20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 99, 100]

關於二分查詢

面試過很多人,對於初級程式設計師來說,我一般會給他簡單的已經比較成熟的演算法來考察他,一來來他對既有演算法的熟悉度,二來考察他對於一般程式設計問題的邏輯思維能力,二分查詢是有序數列中查詢的常用演算法,也是比較容易實現的查詢演算法之一,這個是stl的實現 template randomaccessit...

關於二分查詢

在電腦科學中,二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 1 對數搜尋 英語 logarithmic search 2 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過...

關於二分查詢

一 關於二分查詢 1.查詢目標值 當right nums.size 1時,判定條件應該為left right right賦值時也應該是mid 1 當right nums.size 時,判定條件應該為left 目標值的數 int search vector nums,int target return...