自主编程实现二分法查找

来源:互联网 发布:ipsec dh算法 编辑:程序博客网 时间:2024/05/29 09:38

    今天出去笔试,遇到一道题目让我们用二分法查找一已排好序的数组中的数据,并返回该数据的位置,这

是我第一次碰到使用二分法的编程题,一开始还是有点小慌得,毕竟之前没有写过,怕有些注意点没法试卷中

检测出来,不过二分法的概念还是很好理解的,主要思想是:(设查找的数组区间为a[front, end])

(1)确定该区间的中间位置K
(2)将查找的值T与a[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。
自己也是没多会儿便写好了该编程题,但是后来回想起来,发现还是有几个细节没处理好:
(1)递归时没有判断传入数组的有效性
(2)没有考虑查找的数不在该数组中的情况
于是自己回来重新编写了一个完整并且没有漏洞的二分法查找代码,如下(分递归和不递归实现两种方法):
#include<stdio.h>  #include <assert.h>  #define N  10    //递归算法  int GetPosi(int *a,int nNum,int front,int end)  {      static int mid ;      assert(NULL != a) ;            if(front >= end)      {          return 0 ;      }          if(nNum == a[front])    {    return 1 ;    }          mid = (front+end)/2 ;      if(mid == front)      {          mid=mid+1 ;      }            if(a[mid] == nNum)      {          return mid+1 ;      }         else if(a[mid]<nNum)      {          front = mid ;                     return GetPosi(a,nNum,front,end) ;      }      else if(a[mid]>nNum)      {          end = mid ;          return GetPosi(a,nNum,front,end) ;      }            }      int main()  {     int a[N] = {1,2,3,4,5,6,7,8,9,10} ;     int nNum ;     int front,end,mid;     printf("请输入您想查询的数字:");      scanf("%d",&nNum) ;     front = 0 ;     end = N-1 ;          //未用递归      /*mid = (front+end)/2 ;     while((front<end)&&a[mid] != nNum)    {         if(a[mid]>nNum)         {             end = mid ;             mid =(front+mid)/2 ;         }         else if(a[mid]<nNum)         {             front = mid ;             mid = (front+end)/2 ;             if(mid == front)             {                 mid=mid+1 ;             }         }           }        if(a[mid]==nNum)    {        printf("该查找数的位置为第%d个元素\n",mid+1) ;    }    else    {        printf("未找到该数字\n") ;    }*/               //递归      int pos = GetPosi(a,nNum,front,end) ;          if(pos != 0)     {         printf("该查找数的位置为第%d个元素\n",pos) ;     }     else     {         printf("未找到该数字\n") ;     }           return 0 ;        }





原创粉丝点击