二分法查找是最简单的查找方法之一,其效率也是很不错的(对于有序的),其时间复杂度为,它每一次查找后就能将查找范围缩小一半。
wiki给的概念:
在计算机科学中,折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
例如:
有序序列: 0 ,1,2,3,4,5,6,7,8,9.
假定用一维数组array[10]存储在这有序序列.用low,high,mid作为数组array的下标,key为要找到关键字。
当array[mid] = key;时为找到关键字key.
则:
如果查找其中关键字key的数值为2:
设定low = 0,high = 9;mid = (low+high)/2;
所以mid = 4;(C 语言中对于整数除法用类似于数论中的高斯函数取值。)
第一次查找后:
因为array[4] = 4; key = 2;
即 key
所以限定下一次在数组查找范围是下标0~mid-1;(因为我们假定当array[mid] = key;时为找到关键字key.因此向下移动一位)
则:
low = 0,high = mid-1 = 4 - 1= 3;
mid = 1;
第二次查找后:
array[mid] = array[1] = 1;
即 key>array[mid];
所以下一次的在数组查找范围是下标:mid+1 ~ 3;
则:
low = mid+1 = 2; high = 3;
mid = 2;
而array[mid] = array[2] = key;
已经查找到;
代码实现(C语言):
#include "stdio.h"
//递归二分法查找
void HalfSearch(int *array,int low,int high,int key)
{
if(low>high)
{
printf("没有你要查找的数.\n");
return ;
}
if(key == array[mid])
{
printf("在有序序列第%d处查找到!\n",mid);
return ;
}
else if(key > array[mid])
HalfSearch(array,mid+1,high,key);
else if(key < array[mid])
HalfSearch(array,low,mid-1,key);
}
int main(void)
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
HalfSearch(a,0,9,3);
HalfSearch(a,0,9,9);
HalfSearch(a,0,9,1);
HalfSearch(a,0,12,0);
HalfSearch(a,0,9,19);
HalfSearch(a,0,9,-9);
return 0;
}
#include "stdio.h"
void HalfSearch(int *array,int low,int high,int key)
{
while(low<=high)
{
int mid = (low + high)/2;
if(key == array[mid])
{
printf("在有序序列第%d处查找到!\n",mid);
return ;
}
else if(key > array[mid])
low = mid + 1;
else
high = mid - 1;
}
if(low>high)
printf("没有你要查找的数.\n");
return ;
}
int main(void)
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
HalfSearch(a,0,9,3);
HalfSearch(a,0,9,9);
HalfSearch(a,0,9,1);
HalfSearch(a,0,12,0);
HalfSearch(a,0,9,19);
HalfSearch(a,0,9,-9);
return 0;
}
运行实现: