二分搜索||c语言实现

来源:互联网 发布:放置江湖武功数据排行 编辑:程序博客网 时间:2024/05/22 13:52

定义

用于搜索有序的顺序数据,逐步缩小搜索范围.
下面示范一个用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

学习建议

上面只是实现的一种,代码不一定优美完善,用于学习,学习算法数据结构时,可以先看书上定义描述,自己先尽力实现一遍.这样能更加深刻的理解算法,也能学到别人优秀的实现(我怎么没有想到这样),上面只是小小的建议,不适用于每一个人.

原创粉丝点击