二分查詢(遞迴 非遞迴)

2021-10-10 00:16:36 字數 1755 閱讀 9724

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。

起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法

其缺點是要求待查表為有序表,且插入刪除困難。

因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。

使用條件:查詢序列是順序結構,有序。

//二分查詢遞迴實現

public

static

intbinaryserach_recursion

(int arr,

int aimnum,

int low,

int high)

int middle=

(high+low)/2

;if(aimnum > arr[middle]

)else

if(aimnum < arr[middle]

)else

}

為何有了遞迴我們還要去看非遞迴呢?因為我們知道每當我們呼叫乙個函式jvm會在會在虛擬機器棧中建立乙個棧幀,那麼當我們遞迴次數不多當然看不出來,當遞迴的次數過多,那麼我們就會撐爆虛擬機器棧導致棧溢位。

//二分查詢非遞迴實現

public

static

intbinarysearch_loop

(int arr,

int aimnum,

int low,

int high)

int middle=0;

while

(low <= high)

else

if(arr[middle]

> aimnum)

else

return middle;

}return-1

;}

int middle=(high+low)/2;:這裡會有可能middle是int型別可能發生溢位的風險,這個我們在下面細講。

我們在前面看到我們每次算兩個數的平均數數時使用的是int middle=(low+high)/2; 這個在我們int範圍內當然沒事,但是當我們資料過大會導致溢位問題!

int right=

(high-low+1)

/2+low

public

static

intmean

(int a,

int b)

class

indexnode

}public

class

binaryserach_withnode

else

if(aimnum < arr[middle]

)else

else

break;}

}return pos;

}public

static

void

main

(string[

] args)

; indexnode pos=

binaryserach

(arr,0)

; system.out.

println

(pos.index )

; system.out.

println

(pos.flag);}

}

二分查詢 遞迴與非遞迴

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

二分查詢演算法(遞迴 非遞迴)

二分查詢 binary search 先來個比較官方的解釋 二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 對數搜尋 英語 logarithmic search 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如...

二分查詢演算法(遞迴 非遞迴)

二分查詢是針對有序序列來說的,在有序序列中使用二分查詢能大大提高查詢效率。首先確定整個查詢區間的中間位置 mid 用待查關鍵字key值與中間位置的關鍵字值進行比較 若相等,則查詢成功 若大於,則在後 右 半個區域繼續進行折半查詢 若小於,則在前 左 半個區域繼續進行折半查詢 對確定的縮小區域再按折半...