定义
用于搜索有序的顺序数据,逐步缩小搜索范围.
下面示范一个用excel的二分查找过程(因为visio没装好)
过程
- 长度为7的数组,搜索5.
- 递归实现,先判断中间值是否命中查找,命中在代码则是返回.
- 不命中,根据大小选择下一次递归的值,这里5比4大,选择右侧数据,长度和数组发生改变.均折半
- 递归上述过程.
代码实现
#include<stdio.h>
#include<string.h>
#include<errno.h>
//二分搜索 尾递归实现
int fun(int *array , int length , int date)
{
if(array[length/2] == date){
return array[length/2];
}else if(length == 0){
fprintf(stderr , "error : not found \n");
exit(1);
} else{
if(date > array[length/2]){
return fun((array +(length/2)) , length/2 ,date);
}else{
return fun(array , length/2 ,date);
}
}
}
//内存分配包装器
void * Calloc(size_t number , size_t size)
{
void * ptr = NULL;
if((ptr = calloc(number , size)) == NULL){
fprintf(stderr , "calloc error!");
exit(-1);
}else{
return ptr;
}
}
//用于代码调试,遍历数组
void printArray( int * arr , int n)
{
int i = 0 ;
for(i = 0 ; i < n ; i++){
printf("%d \n" , arr[i]);
}
}
int main(void)
{
int * ptr = (int *)Calloc(8 , sizeof(int));
int i = 0 ;
int size = 8;
for(i = 0 ; i < size ; i++){
ptr[i] = i;
}
// printArray(ptr , 8);
//测试是否搜索到数据 这里5可以替换
printf("%d \n" , fun(ptr , 8 ,5));
}
//output : 5
学习建议
上面只是实现的一种,代码不一定优美完善,用于学习,学习算法数据结构时,可以先看书上定义描述,自己先尽力实现一遍.这样能更加深刻的理解算法,也能学到别人优秀的实现(我怎么没有想到这样),上面只是小小的建议,不适用于每一个人.