二分法查找的条件设置

#include <stdio.h>
int Search(int [],int);
int main(int argc, char const *argv[])


{
    int i,j,desnum;
    int seq[10];

    printf("Please input the array:\n");
    for (;seq[i-1] != -1; ++i)
        scanf("%d",&seq[i]);

    printf("Please input the des number:\n");
    scanf("%d",&Desnum);
    j = Search(seq,desnum);
    if( j == 0)
        printf("Not found\n");
    if( j == 1)
        printf("Found\n");
    return 0;
}

int Search(int seq[],int des)
{
    int left,right,middle;
    left = 0;
    right = 9;
    while(left <= right)
    {
        middle = (left + right)/2;
        if (des == seq[middle])
            return 1;
        else if (des < seq[middle])
            right = middle -1;
        else
            left = middle +1;
    }
    return 0;
}

其中关键的三个条件设置是left <= right、right = middle -1和left = middle +1,后两个较容易理解,就是将查找边界向左/右移动一个单位。但是第一个条件值得思考,为什么是<=而不是<。下面给出一个具体的例子:
假设查找到最后一步,范围锁定在seq[2] = 3, seq[3] = 4之间。此时有三种情况:1.目标数为3;2.目标数为4;3.目标数为3.5。下面依次分析:
1.当目标数为3时,下一步middle = 2,找到;
2.当目标数为4时,下一步middle = 2,4 > 3,left = 3。这时候如果设置的是left < right,那么就退出循环了,返回没找到,明显错误,所以应该设置为left <= right;
3.当目标数为3.5时(类型要改为float),下一步middle = 2,3 < 3.5,left = right = 3,下一步middle = 3 < 3.5,left = 4,退出循环,表示没找到。
综上所述,条件应该设置为 left <= right.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值