二分查詢(面試必備)

2021-09-16 23:37:31 字數 1361 閱讀 5693

原文:

在電腦科學中,二分搜尋(binary search),也稱折半搜尋(half-interval search)、對數搜尋(logarithmic search),是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

給定乙個有序的陣列,查詢value是否在陣列中,不存在返回-1。

int binarysearch(int array, int n, int value)

return -1;

}

給定乙個有序的陣列,查詢value第一次出現的下標,不存在返回-1。

int binarysearch(int array, int n, int value)

return array[right + 1] == value ? right + 1 : -1;

}

如果問題改為查詢value最後一次出現的下標呢?只需改動兩個位置:

1.if (array[middle] >= value)中的等號去掉;

2.returnright+1改為left-1

給定乙個有序的陣列,查詢最接近value且大於value的數的下標(如果該數存在多個,返回第乙個下標),不存在返回-1。

int binarysearch(int array, int n, int value)

return array[right + 1] > value ? right + 1 : -1;

}

如果問題改為查詢最接近value且小於value的數的下標(如果該數存在多個,返回最後乙個下標)呢?只需改動兩個位置:

1.if (array[middle] > value)加入乙個等號;

2.return array[right + 1] > value ? right + 1 : -1;改為return array[left-1] < value ? left - 1 : -1;

二分演算法所操作的區間,是左閉右開,還是左閉右閉,需要在迴圈體跳出判斷中,以及每次修改left,,right區間值這兩個地方保持一致,否則就可能出錯。

[ 1 ] 二分搜尋演算法. wikipedia.

[ 2 ] july. 有序陣列的查詢

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

二分查詢及變種二分查詢

二分查詢也稱折半查詢 binary search 它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。查詢條件 查詢區域的左邊界,小於等於查詢區域的右邊界 查詢過程 1.迴圈條件 查詢條件 2.計算序列中間下標位置 3.如果待查詢...