二分查詢(非遞迴)

2021-10-09 03:20:18 字數 1933 閱讀 6416

二分查詢只適用於從有序的數列中進行查詢

執行時間為對數時間o(log⁡2

n\log_2

log2​n

), 即最多隻需要log⁡2

n\log_2

log2​n

步。[0,99]中100個數進行查詢,需要26<100<27步,最多需要7步

思路:確定出歸條件,找到了或者start>end找到中間的數,如果比中間數大,則向左找

end = mid-1;

如果比中間數大,則向右找,知道找到位置;

start = mid +1;

public

class

erfen

// 遞迴方法

public

intsearchrec

(int start,

int end,

int target)

if(target < arr[

(end-start)/2

])return

searchrec

(start,end,target);}

else

return

searchrec

(start,end,target);}

}// 非遞迴實現

public

intsearch

(int start,

int end,

int target)

else

if(target < arr[

(end-start)/2

])else

}return-1

;}public

static

void

main

(string[

] args)

; erfen test =

newerfen

(arr)

;int index1 = test.

searchrec(0

,arr.length-1,

100)

;int index2 = test.

search(0

,arr.length-1,

100)

; system.out.

println

("index1="

+ index1);//

system.out.

println

("index2="

+ index2);//

}}

如果陣列中含有多個重複數字,上述方法只能實現,找到乙個數。如果想找到所有數字,這需要對上述方法進行優化。

思路:

當找到第乙個數時,不要進行return,而是將其儲存在乙個list中,並且對其進行左,右搜尋,直到下個數不滿足條件,或者index超過引索

public list searchrecplus

(int start,

int end,

int target)

reslist.

add(mid)

;int temp2 = mid +1;

while

(temp21&& arr[temp2]

==target)

return reslist;}if

(target < arr[

(end-start)/2

])return

searchrecplus

(start,end,target);}

else

return

searchrecplus

(start,end,target);}

}

二分查詢(遞迴 非遞迴)

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。使用條件 查詢序...

二分查詢(非遞迴)

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。如果待查序列為空,那麼就返回 1,並退出演算法 這表示查詢不到目標元素。如果待查序列不為空,則將它的中間元素與要查詢的目標元素進行匹配,看它們是否...

二分查詢 遞迴與非遞迴

最近做了一道題目,在弄清原理之後發現怎麼也過不去,找了幾個小時的bug,結果問題就出現在二分查詢的知識點上,暑假是有接觸過二分的題目,應該是沒有完全理解才會在昨天的那道題上碰釘子,藉此寫一下對二分的理解來鞏固鞏固以前的知識。一談起查詢,最先想到的無非是遍歷整組資料,複雜度為o n 但是對於一組有規律...