1. 二分查找概念
1.1 二分查找前提
表是按升序排列
1.2 二分查找过程
- 将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
- 否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
- 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
2. 代码实现
#include <stdio.h>
int binary_search(int key, int iArr[], int iArrLen) //自定义函数binary_search()
{
int iLow,iHigh,iMid=0;
int iSearchCount=0,iSucSeaConut=0;
iLow=0;
iHigh=iArrLen-1;
while(iLow<iHigh) //査找范围不为0时执行循环体语句
{
iSearchCount++; //iSearchCount 记录査找次数
iMid=(iLow+iHigh)>>1; //求中间位置 这里用的 位操作
if(key<iArr[iMid]) //key 小于中间值时
iHigh=iMid; //确定左子表范围
else if(key>iArr[iMid]) //key 大于中间值时
iLow=iMid+1; //确定右子表范围
else if(key==iArr[iMid]) //当key等于中间值时,证明查找成功
{
printf("查找成功! \n 查找 %d 次! iArr[%d]=%d",iSearchCount,iMid,key); //输出査找次数及所査找元素在数组中的位置
iSucSeaConut++; //iSearchCount 记录查找成功次数
break;
}
}
if(iSucSeaConut==0) //判断是否查找失敗
printf("查找失敗!"); //査找失敗输出no found
return 0;
}
int main()
{
int key = 6;
int iArr[]={1,2,6,22,77,100,101};
int iArrLen=sizeof(iArr)/sizeof(iArr[0]);
printf("key = %d, iArrLen = %d \n",key, iArrLen);
binary_search(key,iArr,iArrLen); //调用自定义函数
printf("\n");
return 0;
}
结果:
key = 6, iArrLen = 7
查找成功!
查找 3 次! iArr[2]=6