二分查找,顾名思义,它的原理是,将排序好的数列分成两部分,判断期待值在高位部分还是在低位部分,然后再将期待值所在的那个区间的数列重新按照这个规则划分成两部分,再比较,直到最后不能划分为止。
优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
假设其数组长度为n,那么该算法复杂度为o(log(n))。代码如下:
1 int binarySearch( int *a , int begin, int end, int key) 2 { 3 int mid = begin + ((end - begin)>>1 ), index; 4 index = a[mid] < key && begin +1 < end ? binarySearch(a, mid+1, end ,key): 5 (a[mid] > key && begin + 1 < end ? binarySearch(a, begin, mid, key): 6 mid*(a[mid] == key) + (-1)*(a[mid] != key) ); 7 8 return index; 9 }
ps.第三行是为了防止int相加后超过int的最大值,故采用这样的算法。