//发现一个非常**的问题,终于明白为什么有时候看别人的代码会出现不明符号了,,我也出现了···不过反正我从来不看首页看我的笔记,都是从后台看···吼吼吼
//循环实现
确定该期间的中间位置K
将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找
public int BinarySearch(int[] array, int T) {
if(a==null||low>high)
return -1; int low, high, mid; low = 0; high = array.Length - 1; while (low <= high)//必须是带等于,可以是一个元素 { mid = (low + high) / 2; if (array[mid] < T) { low = mid + 1; } else if (array[mid]>T) { high = mid - 1; } else { return mid; } } return -1; }
//递归实现
int BinSearch(int Array[],int low,int high,int key) {
//边界检查 if (low<=high) { int mid = (low+high)/2; if(key == Array[mid]) return mid; else if(key<Array[mid]) //移动low和high return BinSearch(Array,low,mid-1,key); else if(key>Array[mid]) return BinSearch(Array,mid+1,high,key); } else return -1; }
计算复杂度:--------对于循环来说--就是看循环的次数呗
循环次数 :
第一次循环:n--------n代表的是,在当前循环中,有n个元素参与这项活动,这句话的意思不是说每个元素都顾及到了,而是说当前循环的 元素处于 n个元素中间
第二次:n/2
第三次:n/4
·
·
·
第k次:n/2^k-------同理代表的是,在当前循环中,有n/2^k元素参与这项活动,这句话的意思不是说每个元素都顾及到了,而是说当前循环的进行比较的元素a[mid]处于 n/2^k个元素中间
而在最后一次比较中,一定只有>=1个元素,所以可知
最后n/2^k一定是>=1的,令等于1,所以k=log(n)
变种二分查找:
·插值查找http://blog.csdn.net/u011116672/article/details/50196139
·斐波那契查找【也称作是 仅使用 加减法实现二分查找的算法 (然而并不明白别的算法除了加减法还用到别的了么??)】看http://www.cnblogs.com/bethunebtj/p/4839576.html
###4.26复习,注意到了边界检查鼓掌! 遗漏点low<=high--------可以是一个元素。
&&感悟:看过斐波那契,突然明白过来,不论是哪种二分查找,都是在已知的多少个元素中进行查找,并且这些已知的数目的元素的值都知道
对斐波那契来说:n-(F(k-1))= F(k)-1 - F(k-1) = F(k) - F(k-1)-1 = F(k-2)-1------这是右侧的元素个数 k-=2得到的
F(k-1)-1---则是左侧元素的个数
而普通的则是 mid-1-low========左侧元素个数
high-(mid+1)========右侧元素个数