二分查找的思想:

假设数据是按升序排序的,对于给定值key,从序列的中间位置开始比较,如果当前位置值等于key,则查找成功;若key小于当前位置值,则在数列的前半段中查找;若key大于当前位置值则在数列的后半段中继续查找,直到找到为止。

二分查找思想并不复杂,但是在写代码的时候一定要控制好边界值。有两种控制边界值的方法,左闭右闭和左闭右开。

循环实现:

intBinarySelect(int*a,intsize,intkey){if(a==NULL||size==0){return-1;}intleft=0,right=size-1;//改成左闭右开right=size;while(left<=right)//改成左闭右开left<right{intmid=left+(right-left)/2;if(a[mid]>key){right=mid-1;//改成左闭右开right=mid;}elseif(a[mid]<key){left=mid+1;}else{returnmid;}}return-1;}

递归实现:

intBinarySelect_R(int*a,intleft,intright,intkey)//此时传的是左闭右闭区间{if(left>right)//如果right传的是开区间,条件是>=return-1;intmid=left+(right-left)/2;if(a[mid]>key){returnBinarySelect_R(a,left,mid-1,key);//如果right传的是开区间,此时第三个参数是mid}elseif(a[mid]<key){returnBinarySelect_R(a,mid+1,right,key);}elsereturnmid;}