查找关键字符:
二分(折半)查找法 (缩小区域)
前题:查找序列是有序(降/升序)
假定:升序
1、每次取序列中间元素进行比较
2、如果key>mid,说明查找值在中间元素的右侧,
如果key<mid,说明查找值在中间元素的左侧,
key==mid,说明查找成功
3、如果查找不成功,则再重复1,2步骤,直到查找成功或失败
#include<stdio.h>
void main()
{
int buf[]={1,2,3,4,5,6,7,8,9,10,11}; //10
// l m r
// l m r
// ml r
//折半查找:
int mid,left=0,right=10;
int key=10;//需要在序列查找2是否存在
//从区间中获取中间元素的下标
while(left<=right)
{
mid=(left+right)/2;
if(key<buf[mid]) //条件成立 输出 查找值在右侧
{
right=mid-1;
printf("左侧\n");
}
else if(key>buf[mid]) //条件成立 查找值在右侧
{
left=mid+1;
printf("右侧\n");
}
else if(key==buf[mid]) //条件成立
{
printf("查找成功,在第%d个元素\n",mid+1);
break;//跳出循环
}
}
}
二分法指针实现
#include<stdio.h>
void main()
{
//数组:
int buf[10]={1,2,3,4,5,6,7,8,9,10};
// L M R
// L R
//二分法(折半查找):
//1、确定左右区域并指现中间值
//2、key>mid 右侧 key<mid 左侧
int* left=buf,*right=buf+9,*mid=NULL;//设置地址为0的指针为空指针(不指向任何的元素)
int key=23;
while(left<=right)//
{
mid=left+(right-left)/2;
if(key>*mid)//右侧
{
left=mid+1;
}
else if (key==*mid)//成功
{
printf("查找成功:%d\n",*mid);
break;
}
else//左侧
{
right=mid-1;
}
}
key= 23 不存在 请按任意键继续
key=3 存在