二分法查找的条件设置

来源:互联网 发布:final cut mac 编辑:程序博客网 时间:2024/05/21 00:16
#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.

0 0
原创粉丝点击