本题要求使用二分查找法,在给定的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的元素。
#include<stdio.h>
int main()
{
int n = 0;
int x = 0;
scanf("%d %d", &n, &x);
int arr[12] = {0};
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
if (arr[i] == arr[i - 1] && i > 0)
{
printf("Invalid Value");
return 0;
}
}
int left = 0;
int right = n-1;
int mid=0;
while (1)
{
mid = (left + right) / 2;
if (left > right)
{
printf("Not Found");
return 0;
}
printf("[%d,%d][%d]\n", left, right, mid);
if (arr[mid] == x)
{
printf("%d\n", mid);
return 0;
}
else
{
if (arr[mid] > x)
{
right = mid-1;
}
else if (arr[mid] < x)
{
left = mid+1;
}
}
}
return 0;
}