浅谈二分查找
来源:互联网 发布:软件合同书 编辑:程序博客网 时间:2024/06/10 15:07
参考文章点击这里
1.二分查找值为key的下标,如果不存在返回-1
int binsearch(int a[],int len,int val){ int first=0,last=len-1,mid=0; while (first<=last){ mid=first+(last-first)>>1; if(a[mid]==val){ return mid; } else if (a[mid]>val){ last=mid-1; } else{ first=mid+1; } } return -1;}
int binsearch(int a[],int len,int val){ int first=0,last=len-1,mid=0; while (first<last){ mid=first+(last-first)>>1; if(a[mid]==val){ return mid; } else if (a[mid]>val){ last=mid; } else{ first=mid+1; } } if(a[first]==val){ return first; } return -1;}
我们仔细观察这段代码知道我们在last=mid-1的地方改为last=mid;跳出循环的时候first==last,这个时候我们需要在跳出循环的时候检查是否满足题意即可。
int binsearch(int a[],int len,int val){ int first=0,last=len-1,mid=0; while (first<last-1){ mid=first+((last-first)>>1); if(a[mid]==val){ return mid; } else if (a[mid]>val){ last=mid-1; //last=mid; 这两种情况都是可以的 } else{ first=mid; } } if (last>=0&&a[last]==val){ return last; } else if (a[first]==val){ return first; } return -1;}
我们在来仔细观察这段代码,我们把first得值变为mid这样做的后果会导致数组为2的时候发生死循环
[1,2] 目标为2,开始的时候first=0,last=1, mid=0,这时候会发生死循环,我们只要控制数组的长度为2的时候跳出循环,然后检查rigth的值,再检查left的值,可以自己体会为什么.
通过对上面的研究,我们发现right==mid or right==mid-1,其实对于while(……)中的内容是没有变化的,如果right==mid,一定不会有left>right如果right==mid-1,则条跳出循环后可能会出现left>rigth
还有一个重要的结论就是容易产生死循环的地方是left==mid,这种情况有两种,分别为数组长度为1,2。left=mid(对应数组长度为2),left==mid+1(对应数组长度为1)
0 0
- 浅谈二分查找法
- 浅谈二分查找
- 浅谈二分查找
- 浅谈二分查找算法
- 浅谈二分查找
- 浅谈二分查找
- 浅谈二分查找
- 浅谈数据的查找(二分查找)
- 浅谈PHP第三弹---使用二分查找法查找数组中的元素位置
- 【捷哥浅谈PHP】第三弹---使用二分查找法查找数组中的元素位置
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- WEB渗透需要学些什么
- 国内centos yum设置
- Webapi传参数
- mt7601驱动使用(三)
- 使用Nexus搭建Maven私服
- 浅谈二分查找
- EventBus : No subscribers registered for event class
- HttpClient的Get请求和Post请求
- poj2299 马桶吸题使用 归并排序解
- ddd
- vs2015
- CSS属性之多列属性(column)
- java位运算(左移、右移)
- d3js比例尺