其實這名字有點拗口。
簡單來說就是:
一個已知的數組(知道其所有屬性),
然后在選出數組中的一個元素,
再讓程序求出這個元素在數組的索引。
其實有兩種做法:
第一種就是最簡單的,先把這個數組遍歷一遍,一個一個去比較,看看哪個相等。
第二種就是我們要講的一個算法:二分法查找
首先來看到的第一種方法
其實這個思路就很簡單,就是上面說的。
先遍歷,在去一個一個比較。假如比較到了就賦值索引,然后跳出循環。
這個方法有個缺點就是費時,雖然說程序運行中看不出,可是我們知道這是最沒有效率的方法。
然后我們在看到第二種方法:
二分法,只不過這種方法有個缺點,就是數組必須要是順序排列的。
這個算法的大概思路是這樣的:
如一個數組:
假如我們要求出這里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中的大於換成小於
二分法最最重要的一點就是數組要有序排列。