二分查找
二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置。
前提:线性表中的记录必须是关键字有序(通常从小到大),线性表必须采用顺序存储。
基本思想:取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;否则,在右半区查找。不断重复,直到查找成功或查找失败为止。
示例代码如下:
/*折半查找,递归实现*/
template<class T>
int Binary_Search(T *x, int N, T keyword)
{
int low = 0, high = N-1,mid;
while(low <= high)
{
mid = (low + high)/2;
if(x[mid] == keyword)
return mid;
if(x[mid] < keyword)
low = mid + 1;
else
high = mid -1;
}
return -1;
}
/*折半查找,递归实现*/
int Binary_Search2(int *a, int low, int high, int key)
{
if(low > hign)
return -1;
int mid = (low + high) / 2;
if(a[mid] == key)
return mid;
if(a[mid] > key)
return Binary_Search2(a, low, mid-1, key); //有没有return都可以。
else
return Binary_Search2(a, mid+1, high, key); //有没有return都可以。
}
后记:
查找和排序都是在程序设计中经常用到的算法,查找相对而言较为简单,不外乎顺序查找、二分查找、哈希表查找和二叉排序树查找。
在面试的时候,不管是用循环还是用递归,面试官都期待应聘者能够信手拈来写出完整的二分查找代码,否则可能连继续面试的兴趣都没有。
以上两句话引出自《剑指Offer:名企面试官精讲典型面试题》,昨天去面试一家私企,面试官出的第一道编程题是二分查找,问得我一头雾水,当时就悲剧了,回来以后看到书中这句话,深刻理解了它的含义。
水平非常有限,代码有出错的地方,希望大家指正,免得误导新人。