二分法的查找图解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二分法的查找图解
最近做了几家笔试题,基本在选择题都考到二分查找法的次数。由于对下标和数组大小的不确定,做错了好几个,今天,希望通过图解来说明一下二分查找的比较次数。
二分查找:给定数组是有序的,给定一个key值。每次查找最中间的值,如果相等,就返回对应下标,如果key大于最中间的值,则在数组的右半边继续查找,如果小于,则在数组左半边查找,。最终有两种结果,一种是找到并返回下标,第二种是没找到。
下面给个例子说明一下:
有一个数组arr[10];
0 1 2 3 4 5 6 7 8 9
定义两个边界下标low和high,定义中间下标mid;
low=0;high=10-1; mid = (low+high)/2;
在进行每一步的比较时,low<=high;
如果我们寻找key为56的值的下标。
第一次我们找到中间下标mid = 4;
0 1 2 3 4 5 6 7 8 9
low mid high
arr[4] = 11,比当前key值小,所以我们在右半边查找,令low = mid + 1;high不变;
我们找到中间下标mid = (5+9)/2 =7;
0 1 2 3 4 5 6 7 8 9
low mid high
arr[7] = 33,比当前key值小,所以我们在右半边查找,令low = mid + 1;high不变;
我们找到中间下标mid = (8+9)/2 =8;
0 1 2 3 4 5 6 7 8 9
low mid high
此时key == arr[mid] == arr[8];停止查找,返回下标mid;
所以在查找56的时候,比较次数为3次。
下面给出代码
int search(int arr[],int n,int key)
{
int low = 0,high = n-1; // n个数据-1,high不能超数组元素个数的上限;
int mid,count=0;
while(low<=high)
{
mid = (low+high)/2;
if(arr[mid] == key)
return mid;
if(arr[mid] low = mid + 1; else high = mid - 1; } return -1; } 继续举例解析: 通过上列进行说明:需要让程序计算出当前的key 值对应的温度是多少℃? arr[10] = { 3 , 6,7, 10,11,16,20,33,56,89}; //=从0-9℃的10个温度AD值从小到大排列(有序); key=55; // key 假设是AD采用到的数值; int search(int arr[],int n,int key) { int low = 0, high = 10-1; // 数据10 -1=9个,high不能超数组元素个数的上限; int mid=0; while(low<=high) { mid = (low+high)/2; //先计算出数据的平均值,然后待人数组中找数据来比较; if( key >= arr[mid] && key <= arr[mid+1] ) return mid; if(arr[mid] low = mid + 1; //从原来mid值+1重新赋值 else high = mid - 1; //从原来mid值-1重新赋值 } return -1; }