介绍
二分查找算法,也称为折半查找算法,是一种常见且高效的搜索算法,用于在有序数组或列表中查找特定元素的位置。这种算法的基本思想是将目标值与数组中间的元素进行比较,从而缩小搜索范围,因为有序性为算法提供了确定性和可预测性
基本原理
-
有序数组: 二分查找要求被搜索的数组必须是有序的。这可以是升序或降序,但必须保持有序性。
-
中间元素: 算法首先确定数组的中间元素。如果数组长度为偶数,可以选择中间两个元素中的任意一个。
-
比较: 将目标值与中间元素进行比较。如果相等,则找到了目标元素,算法结束。如果目标值小于中间元素,则在数组的左半部分继续查找。如果目标值大于中间元素,则在数组的右半部分继续查找。
-
减半搜索范围: 根据目标值与中间元素的比较结果,可以将搜索范围缩小一半。如果在左半部分查找,舍弃右半部分;如果在右半部分查找,舍弃左半部分。这一步是二分查找效率高的关键。
-
重复上述步骤,直到找到目标元素或确定目标元素不在数组中。
实现步骤
初始化一组数据
int data[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
初始化变量
left //存放数组的第一个索引下标
right //存放数组的最后一个索引下标
target //接受用户要查找的数
mid // 存放中间值索引
int left = 0;
int right = sizeof(data) / sizeof(int)-1;
int target = 0;
int mid = 0;
sizeof 中C语⾔是⼀个关键字,是可以计算类型或者变量⼤⼩的,其实 sizeof 也可以计算数组的⼤⼩,单位是字节。
这里使用sizeof计算数组的占用内存的总空间,再除一个int类型(4 Byte),最后可以得到数组中元素的个数,由于这里是求数组中最后一个索引的下标,所以 -1
接收用户输入
scanf("%d", &target);
中间元素
mid = (left + right)/2;
先运算出中间索引,从中间开始向左或右开始查找,极大的减小了程序的时间复杂度和空间复杂度
比较(减小搜索范围)
if (data[mid]<target)
{
left = mid+1;//如果值小了,将当前的中间值作为起点索引继续查找
}
else if (data[mid] > target) {
right = mid-1;//如果值大了,将当前的中间值作为终点索引继续查找
}
else
{
printf("找到了,%d的索引是%d", target, mid);
}
这里我们先将 计算出的中间索引中的数据与输入的值相比较,
如果中间值小于target目标值,则将查找范围缩小值另一半(既然中间值小于target目标值,就可以将left值缩小至中间值的下一个值,继续比较);
中间值大于target目标值时 同理;
最后找到目标值索引
重复
这里我们使用while循环重复运行 比较 程序,不断缩小范围,直至匹配到目标值
while (left<=right)
{
if (……)
{
……
}
else if (……) {
……
}
else
{
printf("找到了,%d的索引是%d", target, mid);
break;
}
}
在 比较 程序中,left值不断增加,right值不断减小,当left值大于right值时, 则本组数据查找完毕,没有target目标值,结束循环,执行以下程序
if (left>right)
{
printf("没找到输入的数字");
}
代码实现
int main()
{
int data[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//初始化数据
int left = 0;//数组的第一个索引下标
int right = sizeof(data) / sizeof(int)-1;//数组的最后一个索引下标
int target = 0;//接收用户的输入
int mid = 0;//中间值
printf("请输入你要查找的数:");
scanf("%d", &target);
while (left<=right)
{
mid = (left + right)/2;//运算中间值
if (data[mid]<target)
{
left = mid+1;//如果值小了,将当前的中间值作为起点索引继续查找
}
else if (data[mid] > target) {
right = mid-1;//如果值大了,将当前的中间值作为终点索引继续查找
}
else
{
printf("找到了,%d的索引是%d", target, mid);
break;
}
}
if (left>right)
{
printf("没找到输入的数字");
}
return 0;
}
以上是本文全部内容