二分查找是一种效率较高的查找方式,但是仅仅限于在有序排列的元素中使用
折半查找法也称为二分查找法,它的基本思想是,将元素先分成两半(假设有n个元素)n/2,将n/2与要找的数字进行比较,如果正好等于要查找的数字,那么程序结束,如果n/2大于要找的目标数字,那么接下来只需要在元素的左边进行查找(0~n/2)
循环上述的部分,直到找到目标数字,程序结束,然后输出找到数字
那么接下我们来详细的解说一下折半查找的过程
假设我们创建了一个数组
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
我们首先要做的就是先找到那个中间元素,后期中间元素还要符合我们的要求去进行变动,所以我们可以先定义两个下标,left和right
int left = 0;//左下标
int right = sizeof(arr) / sizeof(arr[0]) - 1;//右下标--元素个数减一
int mid = (left + right) / 2;//中间元素下标
接下来我们只需要将要找的数字与中间元素进行比较,我们假设要找的n = 8
因为arr[mid] < n;
所以left = left + 1;//直接pase掉左边的数字1,2,3,4,5
然后重新求得中间元素的下标mid = (left + right) / 2;
再用新求得的中间元素与n进行一个比较
............
循环上述步骤,直到找出我们的n,然后循环结束
最后我们要考虑的一个问题就是,循环结束的条件是什么,我们可以想一下,在我们找到目标元素之前我们的left是一直小于right的(也有可能等于),那么当我们找到目标元素之后,left++(或者right--)之后,我们的left就会大于我们的right,此时循环就要结束了,所以我们循环体的条件可以是left <= right(不满足这个条件就会退出)
最后一步就是输出我们的目标元素或者元素下标了
具体代码实现:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
int left = 0;//左下标
int right = sz - 1;//右下标
//输入要找的数字
int n = 0;
printf("请输入一个1-9的数字:\n");
scanf("%d", &n);
while (left <= right)
{
int mid = (left + right) / 2;//确定中间值
if (arr[mid] < n)
{
left = mid + 1;
}
else if (arr[mid] > n)
{
right = mid - 1;
}
else
{
printf("找到了下标是%d", mid);
break;//找到之后break直接跳出循环
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
活动地址:CSDN21天学习挑战赛