二分查詢也稱折半查詢(binary search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。如果要查詢的元素在表中,那麼返回它,如果元素不在表中,返回null。
為什麼說二分查詢是一種效率較高的查詢方法呢?
首先我們來看看順序查詢,舉個例子,
比如我們有:
3,6,9,11,12,15,19,20,22,
這九個數字。
我隨便選擇其中的乙個數字,假設是11,我們要從這九個數字中找到11。如果找到的數字是11,那就找到了,如果這九個數中沒有11,那就找不到。
假設從第乙個開始找,
第一次:3,不對
第二次:6,不對
第三次:9,不對
第四次:11,找到了!
這就是順序查詢,每次尋找只能排除乙個數字,現在我們要找的是11,只要四次,可是如果我們要找的是25,就要九次了,如果數字的個數更多那就要花費更多次數。
那麼效率較高的二分查詢是怎樣的呢?
假設我們要找的數字仍然是11,
第一次:我們取這九個數字的中間的數字:12。11<12,小了,那麼我們就能排除12右邊的部分。
第二次:我們取12左邊部分的中間的數字:9。11>9,大了,那麼我們就能排除9左邊的部分。
第三次:我們取9右邊部分的中間數字:11。11=11,找到了。
這樣的方式要比上面的順序查詢快得多,可能在這個例子中只有一次的差別,可當數字多了呢?那二分查詢的速度就要快的多了,這就是二分查詢。
下面來看看二分查詢在c語言中的運用,這裡我使用的是vs2013。
#include
intmain()
;//tofind表示要找的數字
int tofind =7;
//陣列最左邊元素的下標
int left =0;
//陣列最右邊元素的下標
int right =
sizeof
(arr)
/sizeof
(arr[0]
)-1;
//sizeof(arr)是計算arr的位元組
//sizeof(arr[0])是計算陣列中第乙個的位元組
//兩者相除就是陣列長度
while
(left <= right)
else
if(tofind < arr[mid]
)else}if
(left>right)
system
("pause");
return0;
}
C語言中的二分查詢(折半查詢)
為了提高查詢效率,在乙個陣列中查詢某個資料是否存在時,可以先將陣列資料排序,將排序後的數列 的中點設定為比較的物件,如果要找的元素的值 小於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。即根據比較的結果排除掉陣列一半的元素,再在餘下的一半陣列元素中取中間的乙個元素進行比較,並根據比較的結果...
C語言折半查詢(二分查詢)
定義 對使用者輸入的數是否在已經按順序定義好的一組數上進行查詢 思想 定義好的一組數必須按順序排序,一般從小到大排序 將一組數分為兩個部分 low指第乙個數,mid指中間乙個數,high指第最後乙個數 把查詢數n與mid比較 如果n mid,說明在mid右側,low的位置發生改變,除去當時low本身...
c語言 二分查詢(折半查詢)
a 你的新鞋子好炫酷,多少錢買的呀?b 在100 300之間,你猜一下咯,每次我只告訴你猜大了還是猜小了,直到你猜對為止,看看你能不能很快猜出來。a 小夥伴在生活中有沒有和好朋友玩過類似的遊戲呢,不知道接下來你會選擇何種方式去猜呢?如果從100開始乙個乙個往後試,就顯得稍稍有點無腦了,每次猜測的時候...