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


其實這名字有點拗口。

簡單來說就是:

一個已知的數組(知道其所有屬性),

然后在選出數組中的一個元素,

再讓程序求出這個元素在數組的索引。

其實有兩種做法:

第一種就是最簡單的,先把這個數組遍歷一遍,一個一個去比較,看看哪個相等。

第二種就是我們要講的一個算法:二分法查找

首先來看到的第一種方法

 

其實這個思路就很簡單,就是上面說的。

先遍歷,在去一個一個比較。假如比較到了就賦值索引,然后跳出循環。

這個方法有個缺點就是費時,雖然說程序運行中看不出,可是我們知道這是最沒有效率的方法。

 

然后我們在看到第二種方法:

二分法,只不過這種方法有個缺點,就是數組必須要是順序排列的。

這個算法的大概思路是這樣的:

如一個數組: 

 

假如我們要求出這里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中的大於換成小於

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM