C語言中的二分查詢(折半查詢)

2021-08-30 23:26:03 字數 1631 閱讀 8367

為了提高查詢效率,在乙個陣列中查詢某個資料是否存在時,可以先將陣列資料排序,

將排序後的數列

的中點設定為比較的物件,如果要找的元素的值

小於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。即根據比較的結果排除掉陣列一半的元素,再在餘下的一半陣列元素中取中間的乙個元素進行比較,並根據比較的結果再次排除一半的陣列元素,以此類推,直至最終找到為止。

這就是二分查詢(

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語言 折半查詢(二分查詢)演算法

什麼是折半查詢 當我們在一堆有序陣列中間查詢乙個數的時候,先將中間的數與查詢數進行比較。如果中間數大於我們要查詢的數,則在中間左半邊進行查詢 同樣的,如果中間數小於我們要查詢的數,則在中間往右半邊再次進行查詢。重複以上的過程,直到滿足,如果不滿足,則查詢失敗。條件 元素必須按照大小有序排列。那我們實...