折半查找實例

折半查找:僅能查找有規律變化的數據

#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;//未找到
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章