二分查找法是一种在升序数组中查找所需数的位置的方法(位置以角标形式表示,一定是升序数组)。
比如说,当我们想找11在数组中的位置时,常见方法为for循环遍历查找,但若这个数组非常大时,循环就会占用大量资源。此时若这个数组为升序,我们就可以使用二分查找法
一、原理介绍
当我们找11时,我们先找到该数组的中间值。如图,该中间值为21,易知11小于21,该数组为升序,则11必在21左侧(11在数组中存在)。这个时候我们就只需要在21左侧寻找即可,以此类推,即可找出11的位置。
二、代码实现
为实现以上功能,我们需要以下变量:set,end,mid,key,flag。
set--查找起始位;
end--查找终止位;
mid--中间值位置;
key--查找数;
flag--判断标志;
set和end是查找范围的左右两侧,它们两个确定了mid的位置(mid=(set+end)\2)。
#include <stdio.h>
#define size 9
int main()
{
int a[size] = { 2,6,12,21,31,34,39,41,50 };
int set = 0, end = size - 1,mid = (set+end)/2,flag = 0;
int key;
scanf("%d",&key);
while (set <= end)//起始位<终止位,代表数组中无该数
{
mid = (set + end) / 2;
if (a[mid] > key)//中间值>查找数,说明查找数在左侧
{
end = mid - 1;//查找终止位放于中间,只查找数组的左侧
}
else if (a[mid] > key)//中间值<查找数,说明查找数在右侧
{
set = mid + 1;//查找起始位放于中间,只查找数组的右侧
}
else
{
flag = 1;//中间值=查找数,已找到
break;
}
}
if (flag)
printf("%d", mid);
else
printf("无该数");
return 0;
}
三、效果展示
#include <stdio.h>
#define size 9
int main()
{
int a[size] = { 2,6,12,21,31,34,39,41,50 };
int set = 0, end = size - 1,mid = (set+end)/2,flag = 0;
int key;
while (scanf("%d", &key) != EOF)
{
while (set <= end)
{
mid = (set + end) / 2;
if (a[mid] > key)
{
end = mid - 1;
}
else if (a[mid] < key)
{
set = mid + 1;
}
else
{
flag = 1;
break;
}
}
if (flag)
printf("角标为%d\n", mid);
else
printf("无该数\n");
set = 0, end = size - 1, mid = (set + end) / 2, flag = 0;
}
return 0;
}