二分查詢 BinarySearch

2021-07-04 20:51:34 字數 1061 閱讀 2521

前置條件:乙個有序的序列(假設公升序排列),在序列中查詢指定元素

演算法:首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到相同的元素,或者所查詢的序列範圍為空為止。

int binarysearch(vector

&vec, int value)else

if(value>vec[mid])else

return -1;

}

上面是基於左閉右閉的區間搜尋,下面有一種基於左閉右開的搜尋:

int binarysearch(vector

&vec, int value)else

return -1;

}

溢位

在迴圈體內,計算中間位置的時候,很多人喜歡使用的是這個表示式:

middle = (left + right) / 2;

假如,left與right之和超過了所在型別的表示範圍的話,那麼middle就不會得到正確的值.

所以,更穩妥的做法應該是這樣的:

middle = left + (right - left) / 2;

上面的演算法都是每次迭代3次比較,有沒有方法優化並減少比較次數呢?答案是肯定的。

下面給出乙個2次比較的**:

int binarysearch3(vector &vec, int value)else

}if(vec[left]==value)else

}

我個人更喜歡另外一種寫法,這種寫法在遇到旋轉擴充套件的時候更好改思路:

//左閉右閉,我比較喜歡的一種寫法,擴充套件方便

int binarysearch4(vector

&vec, int value)

if(value1;

}else

if(value>vec[mid])

}return -1;

}

二分查詢演算法的時間複雜度為o(logn)

STL中的二分查詢(binary search)

stl中對於有序序列 vector,list等 提供了相當相當強大的二分搜尋binary search演算法。對於可以隨機訪問容器 如vector等 binary search負載度為對數級別 logn 對於非隨機訪問容器 如list 則演算法複雜度為線性。現在簡要介紹一下幾種常用的binary s...

迭代二分查詢二分查詢

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

1128 二分 二分查詢

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