本題要求使用二分查詢法,在給定的n個公升序排列的整數中查詢x,並輸出查詢過程中每一步的中間結果。如果陣列a中的元素與x的值相同,輸出相應的下標(下標從0開始);如果沒有找到,輸出「not found」。如果輸入的n個整數沒有按照從小到大的順序排列,或者出現了相同的數,則輸出「invalid value」。
二分查詢法的演算法步驟描述如下:
設n個元素的陣列a已公升序排列,用left和right兩個變數來表示查詢的區間,即在a[left] 〜 a[right]區間去查詢x。初始狀態為left = 0,right = n-1。首先用要查詢的x與查詢區間的中間位置元素a[mid](mid = (left + right) / 2)比較,如果相等則找到;如果x < a[mid],由於陣列是公升序排列的,則只要在a[left] 〜 a[mid-1]區間繼續查詢;如果x > a[mid],則只要在a[mid+1] 〜 a[right]區間繼續查詢。也就是根據與中間元素比較的情況產生了新的區間值left、right值,當出現left > right時,說明不存在值為x的元素。
輸入格式:
輸入在第1行中給出乙個正整數n(1≤n≤10)和乙個整數x,第2行輸入n個整數,其間以空格分隔。題目保證資料不超過長整型整數的範圍。
輸出格式:
10 2
1 2 3 4 5 6 7 8 9 10
輸出樣例1:
[0,9][4]
[0,3][1]
1輸入樣例2:
4 571 74 78 100
輸出樣例2:
[0,3][1]
[0,0][0]
not found
輸入樣例3:
5 539 60 80 80 100
輸出樣例3:
invalid value
#include int main()
,n,x;
scanf("%d %d",&n,&x); //輸入陣列的大小n以及查詢數x
for(i=0;i=n)
else
middle=(left+right)/2;
printf("[%d,%d][%d]\n",left,right,middle);
} if(a[middle]!=x)
else
} return 0;
}
7 1 二分查詢 20分
輸入n值 1 n 1000 n個非降序排列的整數以及要查詢的數x,使用二分查詢演算法查詢x,輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。輸入共三行 第一行是n值 第二行是n個整數 第三行是x值。輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。4...
7 1 二分查詢 20分
利用二分查詢找出所給出的數在陣列中的下標 輸入格式 第一行輸入n和m表示陣列有n個資料,m表示要對m個數進行查詢 輸出格式 所有輸出在一行完成,行末沒有多餘空格和多餘回車。輸入樣例 5 5 1 2 3 4 5 1 2 3 4 5 輸出樣例 0 1 2 3 4 一開始無腦map,啊這,tel。換sca...
7 1 二分查詢 20分
利用二分查詢找出所給出的數在陣列中的下標 第一行輸入n和m表示陣列有n個資料,m表示要對m個數進行查詢 所有輸出在一行完成,行末沒有多餘空格和多餘回車。551 2345 1234 5012 34這個如果使用cin輸入的話,必須加上加速器,否則就會執行超時的。還可以使用scanf輸入,這裡就可以不使用...