一篇文章帶你了解C語言二分查找的簡單應(yīng)用
前言
在有序數(shù)組中查找具體的某個數(shù)字n,可能有同學(xué)會說一個一個找,但是這樣的效率實(shí)在太低,特別是對于有序的數(shù)組,效率太低。我們一般從中間元素開始找,查一次去掉一半數(shù)字,這種方法我們給它取名為折半查找即為二分查找,效率大大提高!怎么理解呢?如果有2的32次方個數(shù)字,我們最多只需查找32次,而一個一個數(shù)運(yùn)氣不好卻是2的32次方次。
實(shí)戰(zhàn)演練
這里我們先給出所寫代碼以及運(yùn)行結(jié)果

在這里,給大家分析一下,首先,我們先創(chuàng)建一個有序數(shù)組arr[],然后我們把要查找的7用int k表示,我們要確定這組數(shù)組的左下標(biāo)0,右下標(biāo)為sz-1,sz為數(shù)組的元素個數(shù),即int left = 0,int right = sz-1;我們還要計算一下數(shù)組的元素總個數(shù)int sz =sizeof(arr)/sizeof(arr[0]);然后我們還需找出平均值int mid,如果arr[mid] < k,此時左下標(biāo)left = mid+1,當(dāng)arr[mid] > k,右下標(biāo)right = mid-1,最后只剩一種情況直接打印break;出我們要求的mid,但是這只是一次查找,但是真正的二分查找需要好多次,那我們就需要讓它循環(huán)while起來,需要一個條件left<=right,這說明中間還有元素,直到我們找到,但是當(dāng)left>right時,此時我們可以大膽說明找不到,具體的代碼如上圖所示,這便是整個過程。小伙伴們趕緊int main(),return 0;敲起來試一試吧。
在這里,我在介紹另一種方法,通過函數(shù)的調(diào)用實(shí)現(xiàn)我們的二分查法。

這里的思路主要跟上一種方法的思路差不多,在這里說明一下不能用0 == ret,雖然說0為假,非0為真,但是在這組數(shù)組中1的下標(biāo)就是為0,在這里提醒一下各位,另外,千萬不能不傳sz,即不能把int sz放在函數(shù)那一塊區(qū)域里求,這種寫法是有問題的,什么問題呢?這里簡單說明一下,問題在于此時求的sz不是10,而是1,為什么?數(shù)組arr傳參,實(shí)際傳遞的不是數(shù)組的本身,僅僅傳過去了數(shù)組首元素的地址,即為a的指針,實(shí)際上int a[]只是掛羊皮賣狗肉,本質(zhì)上是指針,所以在函數(shù)不能在函數(shù)內(nèi)部求,根本求不出元素個數(shù),另外,在int a []不需要寫數(shù)字大小,沒有意義,希望大家能夠理解,int a []并不會真正創(chuàng)建一個數(shù)組,大家一定要注意,未來如果我們遇到函數(shù)內(nèi)部需要參數(shù)部分傳過來元素個數(shù),一定是在外部求好元素個數(shù)的,大家一定要多加注意,即在函數(shù)內(nèi)部求元素個數(shù)是做不到的。
思路分析
最后,在這里總結(jié)一下思路,進(jìn)行思路分析,二分查找是要求所查找數(shù)組的順序必須是有序的,我們定義left為最左端的元素,right為最右端的元素,mid=(left+right)/2為數(shù)組的中間位置,然后用所查找的值的位置與mid所處的位置進(jìn)行比較,如果比mid小,只需在數(shù)組的前半部分查找,如果比mid大,在數(shù)組的后半部分查找,以此類推,直到查到到所尋找的值不在該數(shù)組為止,這便是整體的思路。
總結(jié)
本片文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Qt連接數(shù)據(jù)庫并實(shí)現(xiàn)數(shù)據(jù)庫增刪改查的圖文教程
QT連接數(shù)據(jù)庫是應(yīng)用開發(fā)的常用基礎(chǔ)操作,經(jīng)過實(shí)驗(yàn)我總結(jié)了一些例程,下面這篇文章主要給大家介紹了關(guān)于Qt連接數(shù)據(jù)庫并實(shí)現(xiàn)數(shù)據(jù)庫增刪改查的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
c語言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法
本篇文章對c語言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Qt物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)自動清理早期數(shù)據(jù)功能
隨著時間的增加,存儲的歷史記錄也在不斷增加,如果設(shè)備數(shù)量很多,存儲間隔很短,不用多久,數(shù)據(jù)庫中的記錄就非常多,至少是百萬級別起步,而且有些用戶還是需要存儲每一次的采集的數(shù)據(jù)。本文將利用Qt實(shí)現(xiàn)自動清理早期數(shù)據(jù),需要的可以參考一下2022-07-07
Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境的詳細(xì)過程
這篇文章主要介紹了Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
C++中sprintf使用的方法與printf的區(qū)別分析
這篇文章主要介紹了C++中sprintf使用的方法與printf的區(qū)別,實(shí)例分析了sprintf與printf的具體用法及相關(guān)注意事項(xiàng),具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01
C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式
這篇文章主要介紹了C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

