二分查找算法(C语言)

介绍

二分查找算法,也称为折半查找算法,是一种常见且高效的搜索算法,用于在有序数组或列表中查找特定元素的位置。这种算法的基本思想是将目标值与数组中间的元素进行比较,从而缩小搜索范围,因为有序性为算法提供了确定性可预测性


基本原理

  1. 有序数组: 二分查找要求被搜索的数组必须是有序的。这可以是升序或降序,但必须保持有序性。

  2. 中间元素: 算法首先确定数组的中间元素。如果数组长度为偶数,可以选择中间两个元素中的任意一个。

  3. 比较: 将目标值与中间元素进行比较。如果相等,则找到了目标元素,算法结束。如果目标值小于中间元素,则在数组的左半部分继续查找。如果目标值大于中间元素,则在数组的右半部分继续查找。

  4. 减半搜索范围: 根据目标值与中间元素的比较结果,可以将搜索范围缩小一半。如果在左半部分查找,舍弃右半部分;如果在右半部分查找,舍弃左半部分。这一步是二分查找效率高的关键。

  5.  重复上述步骤,直到找到目标元素或确定目标元素不在数组中。


实现步骤

初始化一组数据

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;
}

以上是本文全部内容

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值