#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.