设A[1···n]为一个n个元素的数组,判定给定元素x是否在A 中。
最基础且最简单的方法是顺序搜索,由于元素最大比较次数和数组的大小呈线性关系,也叫线性搜索。
C语言实现:
#include <stdio.h>
int main(){
int a[10]={67,3,17,80,24,56,11,9,76,34};
int x,i=0;
printf("请输入要查找的数字:\n");
scanf("%d",&x);
for(i=1;i<=10;i++){
if(a[i]==x){
printf("%d在第%d个",x,i);
}else{
printf("该数字不在数组里");
break;
}
}
}
所以,当对不明确数组中元素的信息时,对数组A 的所有元素进行扫描是不可避免的,特别是当A数组很大时,效率就会很慢。因此有一个更有效的方法——二分搜索,不过该方法的前提是数组A是一个有序数组,如按升序排列等,所以要提前对数组进行排序,这个在我其他文章里有讲到,可以去看看。
二分搜索法的思路如下:
先设定low,high,mid分别为被搜索数组下标最小值、最大值和中间值。将所要查找的数字x与A[mid]作比较,若x=A[mid],则找到了,i=mid,返回i即可;若x>mid,则将low=mid+1,再重复上述过程,大概示例图如下(电脑上画的有点丑将就看看吧)
![](https://i-blog.csdnimg.cn/blog_migrate/c0dd3feb3bdabd576d0c72d70de5f8d7.png)
C语言实现:
#include <stdio.h>
int main(){
int a[18]={1,4,5,7,8,9,10,12,15,22,23,27,32,35,41,50,52,60};
int x,i=-1;// 将i的初始值设置为-1,便于后面判断是否找到目标元素
printf("请输入要查找的数字:\n");
scanf("%d",&x);
int low,high,mid;
low=0;// 数组下标从0开始
high=17;// 数组下标范围为0~17
while(low<=high){
mid=(low+high)/2;
if(x==a[mid]){
i=mid;
break;// 找到目标元素后停止查找
}else if(x<a[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
if (i == -1) {
printf("未找到\n"); // 如果i的值没有被更新,则输出“未找到”
} else {
printf("你要查找的数字在第%d个\n", i + 1); // 输出结果时需要将下标加1
}
return 0;
}
对于一个大小为n的排序数组,算法BINARYSEARCH执行比较的最大次数为