复习算法准备面试:
我的二分代码
#include<stdio.h>
/*输入待查找的数,返回该数在数组中的下标*/
main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int n;
int left = 0,right = 9;
scanf("%d",&n);
getchar();//如果是%c,必须读取回车换行符号。
if(n == 9) //如果查询的是最大的数字,返回最后一个下标
{
printf("9\n");
return 0;
}
else
{
if(n>9||n<0)
printf("can't find!");
}
while(left < right)
{
if(a[(left+right)/2] < n)
{
left = (left+right)/2;
}
else
{
if(a[(left+right)/2] == n)
{
printf("%d\n",(left+right)/2);
break;
}
else
right = (left+right)/2;
}
}
return 0;
}
后来看了人家的代码:http://blog.youkuaiyun.com/v_july_v/article/details/7093204
总结两点:1.右移,2middle = (left + (right-left)>>1),而不是(left+right)/2,,速度快而且避免了溢出。3.关于位运算的内容,参见CSAPP(Computer Systems: A Programmer's Perspective)4.我的程序的问题:(left+right)/2,在查找整个数列中的最大数的时候,该数列是递增数列,如(8+9)/2 = 8,陷入死循环,必须在开头排除最大值的情况。
5.给定的数列中有重复值的考虑。6非法输入。