二分查找算法实战:解决有序数组中的元素定位问题
一、题目描述
题目要求在一个有序递增数组(不存在相同元素)中,采用二分查找,找出值 x
的位置,如果 x
在数组中不存在,则输出 -1
。输入包括数组元素个数 n
(n <= 10^6
),n
个递增的数组元素(1 <=
数组元素值 <= 10^8
),以及要查找的数 x
(0 <= x <= 10^8
)。输出为 x
在数组中的位置,或者 -1
。
二、代码实现
#include<stdio.h>
int arr[1000];
int check(int mid, int x)
{
return arr[mid] >= x;//满足返回1,不满足返回0
}
int main()
{
int n; scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &arr[i]);
}
int x; scanf("%d", &x);
int l = 1, r = n - 1;
int result = -1;
while (l < r)
{
int mid = (l + r)/2;
if (check(mid, x))
{
if (arr[mid]==x)
{
result = mid;
break;
}
r = mid;
}
else
{
r = mid - 1;
}
}
printf("%d\n", result);
return 0;
}
代码解释:
- 数组定义与
check
函数:首先定义了一个数组arr
用于存储输入的有序数组元素。check
函数用于判断数组中索引为mid
的元素是否大于等于要查找的x
,如果是则返回1
,否则返回0
。 - 输入部分:在
main
函数中,先读取数组元素个数n
,然后通过循环依次读取数组的每个元素并存储在arr
中。接着读取要查找的数x
。 - 二分查找过程:初始化查找的左边界
l
为1
,右边界r
为n - 1
。在while
循环中,计算中间位置mid
。如果check(mid, x)
为真,即arr[mid] >= x
,则进一步判断arr[mid]
是否等于x
,如果相等则找到了目标元素,记录其位置并跳出循环;否则将右边界r
更新为mid
。如果check(mid, x)
为假,则将右边界r
更新为mid - 1
。 - 输出结果:循环结束后,
result
存储了目标元素的位置(如果存在),或者-1
(如果不存在),最后将其输出。 - 自身建议: 在代码中合适地方利用函数进行查找的区间进行判定有利于大家后续的二分答案的书写,在后续我也会持续更新,希望一起共同进步学习。
三、总结
二分查找算法通过不断缩小查找范围,将查找时间复杂度降低到 O(logn),大大提高了查找效率。在实际应用中,只要数据是有序的,二分查找都能发挥重要作用。通过本题的代码实践,我们对二分查找的原理和实现有了更深入的理解,同时也认识到代码优化的重要性。希望本文能对大家在算法学习和实践中有所帮助。