折半查找实例

来源:互联网 发布:100万网络电影预算表 编辑:程序博客网 时间:2024/05/23 12:46

折半查找:仅能查找有规律变化的数据

#include<stdio.h>
#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;//要查找的数

 printf("输入要查找的数:");
 scanf("%d",&num);
 //因此数组不可在其他实现函数中求数组大小。
 sz=sizeof(arr)/sizeof(arr[0]);//计算数组大小,数组作为参数时,仅传递数组首地址。sizeof(arr)仅能求首个元素大小而不是数组总大小。
 i=search(arr,num,sz);//找到返回下标,未找到返回-1

 if(-1==i)
  printf("未找到!\n");
 else
  printf("下标为%d\n",i);

 system("pause");
 return 0;
}

int search(int arr[],int num,int sz)
{
 int light=0;//左值下标,下标从0开始
 int right=sz-1;//右值下标为数组大小-1;
 int mid=0;//中间值下标

 while(light<=right)//除找到那次。每循环一次,左或右下标和中间下标发生一次变化(左下标加,右下标减)
 {
  //找出中间值下标
  //mid=(light+right)/2;//求平均值,该方法可能存在两值和大于最大数值范围出错
  //mid=(light&right)+((light^right)>>1)//求平均值,该方法较难理解,a>>1相当于a/2
  mid=light+((right-light)>>1);//求平均值

  if(num<arr[mid])//数小于中间值
   right=mid-1;//右下标变为中间值下标的前一个
  else if(num>arr[mid])//数大于中间值
   light=mid+1;//左下标变为中间值下标的后一个
   else//数值等于中间值
    return mid;//返回下标

 }
 return -1;//未找到
}