【数据结构与算法】九 二分查找
适用于排好序的数据,如:
int array[] = {
1,2,3,6,7,8,9};
原理
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
如我们现在要查找数组中是否存在8(key)这个数值 。
先找到数组中间的数6,拿6与8进行比较,6比8小所以就在数组的右边在进行一趟二分查找,这样查找每次可以减少一半数量的数组长度。
实现 一 递归
#include <iostream>
using namespace std;
template <class T>
int getArrayLen(T& array){
return sizeof(array) / sizeof(array[0]) ;
}
template <class T>
int binary_search (T& array , int key , int begin , int end){
if(begin >= end)
return -1;
int middle = (begin+end) / 2;
if(array[middle] > key)
return binary_search(array , key , begin , middle);
else if(array[middle] < key)
return binary_search(array , key , middle + 1 , end);
else
return middle;
}
int main(){
int i=-2 , array[] = {
0,1,2,3,6,7,8,9};
for(;i<15;i++)
cout << "searching : " << i << "\t\t position : " << binary_search(array , i , 0 , getArrayLen(array)) << endl;
return 0;
}
结果
searching : -2 position : -1
searching : -1 position : -1
searching : 0 position : 0