其實這名字有點拗口。算法
簡單來講就是:數組
一個已知的數組(知道其全部屬性),blog
而後在選出數組中的一個元素,索引
再讓程序求出這個元素在數組的索引。效率
其實有兩種作法:變量
第一種就是最簡單的,先把這個數組遍歷一遍,一個一個去比較,看看哪一個相等。循環
第二種就是咱們要講的一個算法:二分法查找遍歷
首先來看到的第一種方法程序
其實這個思路就很簡單,就是上面說的。方法
先遍歷,在去一個一個比較。假如比較到了就賦值索引,而後跳出循環。
這個方法有個缺點就是費時,雖說程序運行中看不出,但是咱們知道這是最沒有效率的方法。
而後咱們在看到第二種方法:
二分法,只不過這種方法有個缺點,就是數組必需要是順序排列的。
這個算法的大概思路是這樣的:
如一個數組:
假如咱們要求出這裏6的索引,用二分法如何作呢?
在開始以前咱們要知道三個變量:
最小索引:不就是0嗎
最大索引:不就是數組長度減去1嗎
以及中間索引:不就是最大索引加上最小索引除以2的值嗎
好了,有了這三個值接下來就開始比較了。
首先,使用中間索引的值去與findnum也就是要找的數比較。
而後發現中間索引的值大於findnum的值,這時要作一件事就是去更新上面的三個值
既然findnum小於中間索引的值,那麼中間索引後面的值均可以去掉。
min = 仍是等於0
max = 等於當前的中間索引
mid = 仍是和上面的公式同樣
這時的三個索引變成了這樣
而後在去拿中間索引的值和findnum比較。
而後發現這個值就是咱們要找的,而後返回這個中間索引就好了。
其實不止這一種狀況,還有大於的狀況。
和小於的差很少只不過是min和max這兩個東西的更新不同而已
接下來就給出代碼:
這裏方法最主要的就是如何去更新這三個索引
讓咱們看到這個方法:
這三個索引一開始都被定義出來,賦值了
而後while循環,假如中間索引的值不等於findnum就一直循環
不等於就只有兩種狀況:大於和小於
假如大於的話說明這個數就不在mid和max索引之間
而後就吧mid到max這段去掉,更新max=mid
小於的話狀況恰好相反
去掉min到mid這段,更新min = mid
而後每次循環更新一個mid
若是循環條件爲false時會跳出循環,
這時表示mid索引的值就會等於findnnum
而後返回這個mid索引就好了
如今有一個問題就是假如數組是降序排列的
那麼該怎麼作呢?
其實很簡單,只須要把if中的大於換成小於
二分法最最重要的一點就是數組要有序排列。