標準二分查詢模板

2021-10-02 19:29:22 字數 1481 閱讀 7181

二分查詢作為程式設計師的一項基本技能,是面試官最常使用來考察程式設計師基本素質的演算法之一,也是解決很多查詢類題目的常用方法,它可以達到

必須有序。一般是從小到大有序。

總體上來說:三個變數(左邊界、右邊界、中間值) + 判斷條件(右邊界更新條件和左邊界更新條件)+ 返回值。

計算中間值導致的資料越界。一般我們都是定義左邊界(left)和右邊界(right)都使用 int 型別,如果 left 和 right 足夠大,mid = (left + right)/2,可能會由於 left+right 導致 int 資料型別越界。所以安全的寫法是 mid = left + ((right - left) >> 1) 或者 mid = left + (right - left) / 2,推薦使用右移操作,因為右移比除法快。

需要完成乙個合法性檢查函式,該函式的目的是使用 mid 這個分界點,根據題目進行合法性判斷。如果合法,則右邊界更新,看是否有更小的 mid 符合要求;如果不合法,則左邊界更新,看是否有更大的 mid 符合要求

該合法性檢查函式原型如下:

bool check(int mid)
最終的查詢位置,也就是需要求的 answer 的位置。我們一共有 left、right、mid 這三個位置。根據題意確認哪個變數是我們需要的值。

class binarysearch  else if (nums[mid] > target)  else 

}public int search(int nums, int target) else

}return -1;}}

/*

輸入引數:

nums 要搜尋的有序陣列

len 陣列長度

target 搜尋目標

*/int binary_search(int nums, int len, int target) else if (nums[mid] > target) else

}return -1;

}

1、我們的迴圈條件中包含了left == right的情況,則我們必須在每次迴圈中改變leftright的指向,以防止進入死迴圈。

2、迴圈終止的條件有兩個。一是找到目標;二是沒有找到目標,即 left > right 。

3、防止計算 mid 的時候出現資料溢位。參考上面特別說明的「坑點」。

4、left + ((right -left) >> 1)。對於目標區域長度為奇數而言,是處於正中間的;對於長度為偶數而言,是中間偏左的。因此左右邊界相遇時,只會是以下兩種情況:

即因為mid對於長度為偶數的區間總是偏左的,所以當區間長度小於等於 2 時,mid總是和left在同一側。

二分查詢模板

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。模板一當區間 l,r 的更新操作是r mid l mid 1 時,計算mid時不需要加1。int bsearch 1 in...

二分查詢模板

例如陣列中查詢乙個數 二分查詢的前提是整個陣列是有序的 模板 int a n int l 0,r n 1 int mid,key while l r 另外還有一些二分查詢函式 a.函式模板 binary search arr,arr size indx c.函式功能 在陣列中以二分法檢索的方式查詢,...

二分查詢模板

二分查詢模板總共有兩個 將區間分為 l,mid l,mid l,mid mid 1,r mid 1,r mid 1 r 時,如下 while l r else 將區間分為 l,mid 1 l,mid 1 l,mid 1 mi d,r mid,r mid,r 時,如下 while l r else 對...