C语言版本
1. 什么叫折半查找法
正儿八经的解释:
它称为二分查找法、二分搜索, 是一种在有序数组中查找某一特定元素的搜索算法,搜索过程中从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束;如果某一特定元素大于或者小于中间元素, 则在数组大于或小雨元素的那一半中查找, 而且跟开始一样从中间元素开始比较. 若某1个步骤中数组为空, 则代表找不到.。这种搜索算法每一次使搜索范围缩小一半。这种方法对待查找的列表有两个要求:
必须采用顺序存储结构
必须按关键字大小有序排列
2、折半查找算法复杂度
因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
一次二分剩下:n / 2
两次二分剩下:n/2 / 2 = n/4
…
m次二分剩下:n / (2^m)
最坏情况是只剩下最后一个值时得到结果,即
n / (2^m)=1
所以 : 2^m=n
时间复杂度为: log2(n)
3.根据此题目编写折半查找法
实验代码:
#include<stdio.h>
int main()
{
int a[10]={1,4,6,30,34,66,80,89,100,202};
int high=10,low=0,mid,n,flag=1; //这里的flag为了判断此数是否存在的标志
printf("请输入想要查询的数:");
scanf("%d",&n);
while(low <= high)
{
mid = low + (high-low)/2;
if(a[mid] == n)
{
flag=0;
printf("\n该数是数组中第%d个元素的值",mid+1);
break;
}
else if(a[mid] < n) //数比中间数还要大,那就说明找的数字在右边
low = mid + 1;
else
high = mid - 1; //数比中间数还要小,那就说明找的数字在左边
}
if(flag) //若flag依然为1,则说明数字在while循环里面未找到合适的
printf("\n无此数");
return 0;
}
运行效果:
若有错误,希望各位大佬批评指正~~~