常用的查詢方法之二分查詢

2021-10-14 18:04:42 字數 1786 閱讀 6817

二分查詢:

二分查詢適用有序數列

二分查詢有兩種一種遞迴,一種非遞迴

思路:1首先確定該陣列的中間的下標 mid=(left + right)/2

2然後讓需要查詢的數,findval和arr[mid]比較

3。1如果:findval > arr[mid] 說明你要查詢的數在mid的右邊,因此需要遞迴向右查詢

3.2 如果findval < arr[mid] 說明你要查詢的數在mid的左邊,因此需要遞迴向左查詢

3.3 findval = arr[mid] 找到了,返回

遞迴退出的條件:

1找到就結束遞迴

2遍歷完整個陣列,仍然沒有找到findval,也需要結束遞迴(當left>right)

例項**

/**

* * @methodname: binarysearch

* @description: todo

* @author 63417

* @param arr 陣列

* @param left 左邊的索引

* @param right 右邊的索引

* @param findval 查詢物件

* @return int 沒有找到返回-1

* @date 2023年1月14日

*/public

static

intbinarysearch

(int

arr,

int left,

int right,

int findval)

int mid =

(left + right)/2

;int midval = arr[mid];if

(findval > midval)

else

if(findval < midval)

else

}

如果這個有序陣列,需要查詢的有多個相同的值,對**優化如下:

//1、在找到mid值時,向mid索引值的左邊掃瞄,將所有滿足查詢值的元素的下標,加入到乙個集合中

//2、向mid的索引值的右邊掃瞄,將所有滿足查詢值的元素下標加入集合

//3、返回集合

public

static list

binarysearch1

(int

arr,

int left,

int right,

int findval)

int mid =

(left + right)/2

;int midval = arr[mid];if

(findval > midval)

else

if(findval < midval)

else

//否則就將temp加入集合

resindexlist.

add(temp)

; temp -=1;

//temp左移

} resindexlist.

add(mid)

;//向mid索引的右邊掃瞄

temp = mid +1;

while

(true

)//否則就將temp加入集合

resindexlist.

add(temp)

; temp +=1;

//temp右移

}return resindexlist;

}}

常用查詢演算法之二分查詢

二分查詢實現有序符號表 複雜度分析 參考資料 符號表是一種儲存鍵值對的資料結構,可以支援高效地插入 查詢等操作,因此在這裡使用乙個有序符號表介面來定義這些操作,這個符號表將保持鍵的有序性。public inte ce orderedst comparable value 二分查詢先將被查詢的鍵和陣列...

查詢之二分查詢

二分查詢前提查詢的序列需要有序 十分好理解 取中間值與目標值對比查詢 注意下數值邊界 public static void main string args int arr2 int arr3 int index binarysearch arr,34 int index2 binarysearch...

查詢演算法之 二分查詢

這個例項給出了二叉搜尋演算法在9個元素的陣列arr中查詢某個目標值的過程01 2345 678 7 35812 1623 3355 例子1 查詢目標值2301 2345 678 7 35812 1623 3355 步驟1 索引範圍 0,9 索引first 0,last 9,mid 0 9 2 4 t...