折半查找:仅能查找有规律变化的数据
#include<stdlib.h>
//折半查找
int search(int arr[],int num,int sz);//找到返回下标,未找到返回-1
int main()
{
int arr[]={1,2,4,5,6,7,8,9};
int sz=0;//统计数组大小
int i=0;//记录返回值
int num=0;//要查找的数
scanf("%d",&num);
sz=sizeof(arr)/sizeof(arr[0]);//计算数组大小,数组作为参数时,仅传递数组首地址。sizeof(arr)仅能求首个元素大小而不是数组总大小。
i=search(arr,num,sz);//找到返回下标,未找到返回-1
printf("未找到!\n");
else
printf("下标为%d\n",i);
return 0;
}
{
int light=0;//左值下标,下标从0开始
int right=sz-1;//右值下标为数组大小-1;
int mid=0;//中间值下标
{
//找出中间值下标
//mid=(light+right)/2;//求平均值,该方法可能存在两值和大于最大数值范围出错
//mid=(light&right)+((light^right)>>1)//求平均值,该方法较难理解,a>>1相当于a/2
mid=light+((right-light)>>1);//求平均值
right=mid-1;//右下标变为中间值下标的前一个
else if(num>arr[mid])//数大于中间值
light=mid+1;//左下标变为中间值下标的后一个
else//数值等于中间值
return mid;//返回下标
return -1;//未找到
}