折半条件:必须在一个有序数组内进行。
例如:在一个数组中查找一个数,找到就输出该元素下标,如果没找到就输出-1:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int bin_search(int *p,int x, int n)
{
int left = 0;
int right = n - 1;
while (left <= right)
{
int i = 0;
i = ( right-left)/2+left; //(left&right) + ((left^right) >> 1)
//right/2+left/2;
//如果left和right很大,要防止left+right发生溢出
if (p[i] > x)
{
right = i - 1;
}
else if (p[i] < x)
{
left = i + 1;
}
else
return i;
}
return -1;
}
int main()
{
printf( "请输入数组的大小:_" );
int n = 0;
scanf( "%d", &n);
printf( "请输入要查找的元素\n" );
int x = 0;
scanf( "%d", &x);
int *p = (int *)calloc(n, sizeof( int)); //采用动态内存,提高对内存的利用
if (p == NULL)
{
printf( "out of memory\n");
exit(1);
}
printf( "请初始化数组\n" );
for (int i = 0; i < n; i++)
{
scanf( "%d", &p[i]);
}
int ret=bin_search(p,x,n);
printf( "%d\n", ret);
free(p);
system( "pause");
return 0;
}