為了提高查詢效率,在乙個陣列中查詢某個資料是否存在時,可以先將陣列資料排序,
將排序後的數列
的中點設定為比較的物件,如果要找的元素的值
小於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。即根據比較的結果排除掉陣列一半的元素,再在餘下的一半陣列元素中取中間的乙個元素進行比較,並根據比較的結果再次排除一半的陣列元素,以此類推,直至最終找到為止。
這就是二分查詢(
binary search
),由於二分查詢法每次都根據比較結果排除一半的資料,因此也稱為
「折半查詢法
」。二分查詢的先決條件是:查詢表中的資料元素必須有序。在二分法中,只能對遞增的陣列進行查詢。
演算法步驟: 1
、首先是確定整個查詢區間的中間位置,
mid = ( left + right )/2;
2、用待查資料的值與中間位置的資料值進行比較:若相等,則查詢成功;若大於,則在後半區域繼續進行二分查詢;若小於,則在前半區域繼續進行二分查詢。(這步是迴圈的過程)
3、用二分查詢法對確定後的區域再次進行範圍縮小的查詢,直到查詢到結果為止。
下面舉個例子:用隨機函式rand產生乙個100內的10個元素的陣列,用鍵盤輸入乙個數字,用二分法查詢。若找到列印出位置,若沒有,則輸入無次數。
#include
#include
void
main()
printf(
"隨機產生的陣列為:"
);for
(i=0;i<10;i++)
printf(
"%d "
,a[i]);
//以上為隨機產生陣列過程
printf(
"\n"
);//換行
for(i=0;i<10;i++)
}temp=a[i];
a[i]=a[t];
a[t]=temp;
/*printf("%d ",a[i]);*/
//在這裡輸出排序後的陣列也可以。
}printf(
"排序後的陣列為:"
);for
(i=0;i<10;i++)
printf(
"%d "
,a[i]);
//以上為排序過程
printf(
"\n"
); //換行
printf(
"請輸入要查詢的數字:"
);int
find;
scanf(
"%d"
,&find);
intlow = 0;
//定義陣列低位下標並賦初值
inthigh = 9;
//定義陣列高位下標並賦初值
intmid;
//定義陣列中間下標
site = -1;
while
(low<=high)
else}if
(site != -1)
printf(
"找到了你所需要查詢的數字%d,是第%d個數\n"
,find,site+1);
else
printf(
"沒有找到你輸入的數字。"
);//以上為二分法查詢過程
}
C語言折半查詢(二分查詢)
定義 對使用者輸入的數是否在已經按順序定義好的一組數上進行查詢 思想 定義好的一組數必須按順序排序,一般從小到大排序 將一組數分為兩個部分 low指第乙個數,mid指中間乙個數,high指第最後乙個數 把查詢數n與mid比較 如果n mid,說明在mid右側,low的位置發生改變,除去當時low本身...
c語言 二分查詢(折半查詢)
a 你的新鞋子好炫酷,多少錢買的呀?b 在100 300之間,你猜一下咯,每次我只告訴你猜大了還是猜小了,直到你猜對為止,看看你能不能很快猜出來。a 小夥伴在生活中有沒有和好朋友玩過類似的遊戲呢,不知道接下來你會選擇何種方式去猜呢?如果從100開始乙個乙個往後試,就顯得稍稍有點無腦了,每次猜測的時候...
C語言 折半查詢(二分查詢)演算法
什麼是折半查詢 當我們在一堆有序陣列中間查詢乙個數的時候,先將中間的數與查詢數進行比較。如果中間數大於我們要查詢的數,則在中間左半邊進行查詢 同樣的,如果中間數小於我們要查詢的數,則在中間往右半邊再次進行查詢。重複以上的過程,直到滿足,如果不滿足,則查詢失敗。條件 元素必須按照大小有序排列。那我們實...