求出數組中任意一個元素的索引值

其實這名字有點拗口。算法

簡單來講就是:數組

一個已知的數組(知道其全部屬性),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中的大於換成小於

 

二分法最最重要的一點就是數組要有序排列。

相關文章
相關標籤/搜索