C语言的二分查找方法

目录

1.二分查找是干什么的

2.分析二分查找

3.代码分析

 1、二分查找是干什么的

        二分查找就是所谓的折半查找,在一个有序数组里查找,想要的数据,在只有极少数字遍历查找是可以快速实现,但是如果有序数组里面有成千条数据,遍历的话速度就会很慢,所以才要使用二分查找法,二分查找能节约一大半的速度在程序编译时可以提高速度,下面就用例子来分析一下二分查找法该如何使用。

2、分析二分查找

        例:假设数组里有10个数字:1、2...10,现在需要在其中找到7这个数字的下标位置,使用二分查找法来解决这个问题。

数组中存放数字的方式如下:

1

2

3

4

5

6

7

8

9

10

                        arr[0]   arr[1]   arr[2]  arr[3]  arr[4]  arr[5]   arr[6]   arr[7]  arr[8]  arr[9]

解题思路:

在这个数组中我们需要先找到中间数,中间数就是数组开始与数组结尾之和除以2,所以为(0+9)/2,在int函数中小数点后面的数直接忽略,所以我们所得到的结果为4,arr[4]对应为5,明显与所要查找的数字小了,所以arr[4]右边的数字直接忽略掉,然后继续(5+9)/2=7,arr[7]对应8,比7大,因此继续缩小范围,arr[7]左边的数去掉,(5+6)/2=5,arr[5]对应6,比7小,继续缩小最后获得7这个数字,(注:缩小到最终范围后如果没有查找到想要搜索的数字就说明这个数组中没有那个数字)

2、代码分析

用代码来描述上面的解题思路

先定义一个数组

int arr [] = {1,2,3,4,5,6,7,8,9,10};

用两个函数名来定义数组的头和尾,以及一个函数名来定义折半后的下标

int right = sizeof(arr) / sizeof(arr[0]) - 1; //使用sizeof函数求出数组长度
                                             //数组从0开始需要减1获得下标
int left = 0;                                //数组头部
int mid = 0; //存储头部、尾部折半后的下标

需要查找的数字用一个函数名存储起来,用scanf让用户输入想要搜索的数字

int k = 0;            //想要搜索的数字
scanf("%d\n",&k);     //用户输出想要搜索的数字   

找一个数有多次过程所以用while循环来解决,参数因为头部不能大于尾部,可以写成头部<=尾部

while(left <= right)                //使用循环查找数字

 在for循环中需要循环对半查找公式,以及判断是否找到这个数字找到后需要跳出,结束循环

mid = (right + left)/2;                //找到对半查找的下标
if(arr[mid] > k)                       //判断数组下标为mid时大于k
                                       //尾部在对半查找的下标数基础上减1;
{
    right = mid - 1;
} 
else if(arr[mid] < k)                  //判断数组下标为mid时小于k
                                       //头部在对半查找的下标数基础上加1
{
    left = mid + 1;
}
else                                   //判断等于后输出找到了下标为多少
                                       //找到后需要结束这个循环不然会死循环,使用break语句
{
    printf("找到了!下标为%d\n",mid);
}

最后在while循环外加入一个判断语句说明数组中没有找到这个数字,整个过程结束

if(left > right)                    //头部大于尾部时说明没有这个数组
{
    printf("找不到了!\n");

完整代码如下:

#include<stdio.h>

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int k = 7;
    int left = 0;
    int right = sizeof(arr) / sizeof(arr[0]);
    int mid = 0;
    while(left <= right)
    {
        mid = (left + right) / 2;
        if(arr[mid] > k)
        {
            right = mid - 1;
        }
        else if(arr[mid] < k)
        {
            left = mid + 1;
        }
        else
        {
            printf("找到了!下标为%d\n", mid);
            break;
        }
    }
    if(left > right)
    {
        printf("找不到了!\n");
    }

    return 0;
}

第一次写博客,请大佬们指出问题,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值