大家好!我是小琦,大家在用C语言对有序数列写查找,写递归算法的时候会不会太过于冗余,很捞;今天给大家带来一个简单、好用的算法——二分查找算法(折半查找算法)。
思路:
一.需要一个容器,来容纳数列
二.需要一个放输入查找数的变量,和left左下标,right右下标
三.算法1.找到中间元素(左下标+右下标)/2
2.判断是否是k(需要查找的元素)
情况1: 中间元素<k,则继续查找
情况2: 中间元素>k,则继续查找
情况3: 中间元素=k,则找到了
来我们看图:
注:
1.这只是一次循环,我们需要让程序一直循环找中间元素+判断是否找到
2.用(左下标+右下标)/2,元素有可能不准确,容易超限,我们用left+(right-left)/2
3.还需考虑容器中没有该数的情况
如图:
接下来我们看代码:
//二分查找法
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //定义一个数组
int k = 0; //定义需要输入查找的变量
printf("请输入要查找的数字:\n"); //提示输入
scanf("%d", &k); //输入
int sz = sizeof(arr) / sizeof(arr[0]);
//算出数组元素个数(元素个数=整个数组的大小/单个元素的大小)
int left = 0, right =sz-1; //定义左下标与右下标
while (left <= right)
{
int mid = left+(right-left) / 2; //中间元素的下标,可预防超限
if (arr[mid] < k)
//如果中间元素下标比k小,则左下标移至中间元素的后一位
{
left = mid + 1;
}
else if (arr[mid] > k)
//如果中间元素下标比k大,则右下标移至中间元素的前一位
{
right = left - 1;
}
else
{
//k=中间元素,说明找到了
printf("找到了,下标是:%d", mid);
break;//找到了跳出循环
}
if (left > right)
//如果左下标>右下标,则说明没有找到
{
printf("没找到");
}
}
return 0;
}
小琦在这感谢您的浏览!欢迎大家关注,大家能否给小琦一个点赞、转发、评论,您的每一个点赞、转发、评论都是对小琦最好的支持!