【数据结构与算法】有序数组二分法查找

来源:互联网 发布:联通软件下载 编辑:程序博客网 时间:2024/05/18 02:07

一、原理

1、初设low为第一个元素,high为最后一元素,mid由每一次循环 (low+high)/2 计算得出

2、若数组元素个数为偶数(此处不妨设为10个) low=0 ,high=9   则mid=4 (其实mid是4还是5,无所谓)

3、最坏的情况找到(即用了最多的次数找到)

元素个数为奇数时,如图所示 low =3 ,mid =4,high=5。

元素个数为偶数时,如找‘20’这个元素,最后     high=mid-1=3   ,则low=mid=high=3 三者重合

4、若没找到:在low=high下一步,必有low>high,此时循环停止,故得出循环判断条件:low<=high

二、C语言实现

#include <stdio.h>#define M 10//数组长度#define FALSE 0//found的没找到标志#define TRUE 1//found成功找到的标志int binary_search(int a[],int n);int main(void){static int a[M]={-12,0,6,16,23,56,80,100,110,115};int n,found;printf("Input a num to be searched:");scanf("%d",&n);//输入要查找的数found = binary_search(a,n);//返回给foundif(found==-1){printf("There is no such a num\n");}else{printf("The num you find is a[%d]",found);}return 0;}int binary_search(int a[],int n){int low,mid,high,found;low=0;high=M-1;//起始low为0即第一个元素,high为最后一个元素found=FALSE;//预设found为失败状态while (low<=high){mid = (low+high)/2;//(注意是整除)if(n==a[mid])//刚好找到{found=TRUE;break;}else if (n>a[mid])//偏大,本来是low代替mid,但是已知n!=a[mid],{//故low=mid+1比low=mid再进一步缩小范围low=mid+1;}else//偏小,同理{high=mid-1;}}//若没找到,则low>high,此时found还是==FALSEswitch (found)//判断标志{case TRUE:return mid;case FALSE:return -1;}}

三、递归二分法

#include <stdio.h>#define M 10//数组长度#define FALSE 0//found的没找到标志#define TRUE 1//found成功找到的标志int BinarySearch(int a[],int n, int left, int right);int main(void){static int a[M]={-12,0,6,16,23,56,80,100,110,115};int n,found;printf("Input a num to be searched:");scanf("%d",&n);//输入要查找的数found = BinarySearch(a,n,0,M-1);//返回给foundif(found==-1){printf("There is no such a num\n");}else{printf("The num you find is a[%d]",found);}printf("\n");return 0;}int BinarySearch(int a[],int n, int left, int right) // n为要找的数,left是数组的首元素下标对应low,right是数组的最后一个元素对应high{int mid;if(left<=right){mid = (left+right)/2;if(a[mid]==n) {return mid; //若a[mid]刚好是找要的数,则返回下标}else if(a[mid]<n){left = mid+1;}else if(a[mid]>n){right = mid-1;}return BinarySearch(a,n,left,right);}return -1;//left<=right不满足,则失败}
注意:在else if(a[mid]>n); 处不小心加了分号,在语法上是没有错误的,程序也能执行,但结果是错误的,以后要小心


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子七个月了母乳不够了怎么办 11个月宝宝吃的太多怎么办 宝宝十一个月了上火眼死太多怎么办 9个月孩子不吃辅食怎么办 y一夜没有睡好现在母乳不够怎么办 喂母乳的婴儿总要吃奶怎么办 宝宝四个月了奶水不够吃怎么办 宝宝出生十天了奶水不够吃怎么办 宝宝晚上不吃奶了奶水多怎么办 我家小孩六个月了奶不够吃怎么办 六个月的宝宝奶不够吃怎么办 宝贝六个月了奶不够吃怎么办 奶不够吃宝宝又不吃奶粉怎么办 婴儿到新环境哭闹不睡觉怎么办 婴儿到陌生地方狂哭不止怎么办 在家里遇到有人有陌生人敲门怎么办 在家里晚上睡觉遇到持刀小偷怎么办 在租房中房东随意调换房间怎么办 梦见熟人当面说我坏话偷东西怎么办 偷了家里的存折拿了钱该怎么办 故意让小偷偷车捉住他怎么办 进屋门正对着厕所门怎么办 楼房对面门上放个镜子我该怎么办 从顺丰发的水果坏了顺丰不管怎么办 汽车塑料件被机头水腐蚀了怎么办 孕期吃了炒菜里面加的香精怎么办 五个月宝宝只长身高不长体重怎么办 孩子6个月奶水越来越少怎么办 孩子快三个月了奶水越来越少怎么办 老婆生完孩子乳房肿胀不下奶怎么办 大人吃了退烧药不出汗怎么办 三岁宝宝抵抗力差总生病怎么办 8个月宝宝发烧39度怎么办 小孩发烧吃了药不退烧怎么办 小孩一直发烧39度左右不退怎么办 九个月宝宝反复发烧39度怎么办 八个月宝宝反复发烧39度怎么办 十个月宝宝反复发烧39度怎么办 2岁宝宝反复发烧怎么办39度左右 宝宝两周岁光吃水果不吃饭怎么办 3岁宝宝光吃水果不吃饭怎么办