折半查找法又称为二分查找法。
(一)基本思想假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,此时查找成功;或直到子表不存在为止,此时查找不成功。
2.png(二)时间复杂度二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x。时间复杂度就是求while循环的次数。假设总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k,其中k就是循环的次数。由于n/2^k取整后=1,令n/2^k=1,可得k=log2(n),(以2为底n的对数)。所以时间复杂度可以表示为O(h)=O(log2(n))
(三)优缺点优点是比较次数少,查找速度快,平均性能好;缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
(四)C语言实现#includestdio.h//递归实现intrecur_bin_search(inta[],intlow,inthigh,intkey){if(lowhigh){return-1;}intmid=(low+high)/2;if(key==a[mid]){returnmid;}elseif(keya[mid]){returnrecur_bin_search(a,low,mid-1,key);}else{returnrecur_bin_search(a,mid+1,high,key);}}//非递归实现intbin_search(inta[],intn,intkey){intlow,high,mid;low=0;high=n-1;while(low=high){mid=(low+high)/2;if(key==a[mid]){returnmid;}elseif(keya[mid]){high=mid-1;}else{low=mid+1;}}return-1;}intmain(){inta[]={1,2,3,4,5,6,7,8};intnum=7;intcnt=sizeof(a)/sizeof(int);intindex=recur_bin_search(a,0,cnt-1,num);//intindex=bin_search(a,cnt,num);if(-1==index){printf("Notfound\n");}else{printf("Indexof%dis%d\n",num,index);}return0;}
运行结果:
Indexof7is6
TopCoderCodeforcesAtCoder交流更多内容请北京什么医院治白癜风好北京有白癜风专科医院吗