哈喽各位小博客们大家好!今天我们要学习的是c语言中如何使用二分查找,下面是我的一些理解,有不对之处还请各位大佬点评。
本章目的在于如何在一个有序数组里面用二分查找法来查找相关的值。本次例子将在10个有序数里面查找7。
首先我们创建一个数组,里面存放1.2.3...10 ,一共 10个整数。
int main()
{
int str[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
return 0;
}
再定义两个整形变量 left 和 right ,分别赋初始值为0和,9(9为数组最大下标)。
int left = 0;
int right = 9;
二分查找法的精髓在于用你要查找的数和当前有序数组中间的数进行对比(必须是有序的)
设当前要查找的数为x,有序数组中间的数为y:
若x>y,则说明你要查找的数在y的右边,那么y左边的数就可以不管了:反之亦然。
那么回到代码,当前有序数组中间的数怎么求呢?
咋们可以用(left+right)/2来表示y对应数组的下标。
int x=7;
int y=(left+right)/2;
当str[ x ] >str [ y ]时,将left赋值为y+1; y重新赋值为left+right;
当str[ x ]<str [ y ]时,将right赋值为y-1; y重新赋值为left+right;
当str[ x ]==str [ y ]时,则说明找到了;并且使用break(后面会说为啥要使用他)。
代码如下
if (str[x] > str[y])
{
left = y + 1;
y = (left + right) / 2;
}
else if(str[x] < str[y])
{
right = y - 1;
y = (left + right) / 2;
}
else
{
printf("找到了,该数为:%d",y);break;
}
当然了,我们是不是要进行很多次比较呀,不可能比较一次啊,所以我们需要用到while循环了,
循环的条件就是 left<=right 了
所以当前代码原型就是
int main()
{
int str[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = 9;
int x = 7;
int y = (left+right) / 2;
while (left<=right)
{
if (str[x] > str[y])
{
left = y + 1;
y = (left + right) / 2;
}
else if (str[x] < str[y])
{
right = y - 1;
y = (left + right) / 2;
}
else
{
printf("找到了,该数为:%d", y); break;
}
if (left < right)
{
printf("没找到'");
}
}
return 0;
}
注意:找到该数时要用break跳出此循环,否则你的代码可能就会是个死循环了!!!