折半查找:僅能查找有規律變化的數據
#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;//未找到
}