从表列中查一个数最简单的方法是从第1个数开始顺序查找,将要找的数与表列中的数一一比较,直到找到为止(如果表列中无此数,则应找到最后一个数,然后判定“找不到”)但这种“顺序查找法”效率较低。如果表列中有1000个数,且要找的数恰恰是第1000个数,则要进行1000次比较才得到结果。平均比较次数为500次。

    折半查找法是效率较高的一种方法,基本思路如下:

    假如有已按由小到大排好序的9个数,A[1]--A[9]
    其值分别为:1 3 5 7 9 11 13 15 17
    若输入一个3,想查3是否在此数列中,先找出表列中居中的数,即a[5]
    将要找的数3与a[5]比较,a[5]的值是9,发现a[5]>3,显然3应当在a[1]到a[5]之间
    这样可以缩小查找范围;再找a[1]到a[5]范围内的居中的数,即a[3]
    将要找的数3与a[3]比较,a[3]的值为5,发现a[3]>3,显然3应当在a[1]到a[3]范围内
    再将查找范围缩小一半,与a[1]到a[3]范围内的居中的数a[2]比较,发现要找的数3等于a[2],查找结束,一共比较了3次。在一个有序数组中,折半查找也就是利用二分法的思想找出数组中的内容。

代码如下:

#include<stdio.h>

int binsearch(int x,int arr[],int left,int right)
{
	while(left<=right)
	{
		int mid=left-(left-right)/2;/*注意此处一定要是"<="*/
		/*为何此处不写成mid=(left+reght)/*由于此写法可能会导致溢出*/
		if(arr[mid]==x)
		{
			return mid;
		}
		else if(x<arr[mid])
		{
			right=mid-1;
		}
		else 
		{
			left=mid+1;
		}
	}
	return -1;
}

int main()
{
	int arr[]={1,7,54,87,121,312,938};
	int vet,num;
	scanf("%d",&num);
	vet=binsearch(num,arr,0,sizeof(arr)/sizeof(arr[0])-1);
	if(vet!=-1)/*调用外函数,返回值赋给了vet*/
	{
		printf("%d",arr[vet]);
	}
	else printf("not exist");
	return 0;
}