自主编程实现二分法查找

本文介绍了一种常用的查找算法——二分查找,详细解释了其基本原理,并提供了递归与非递归两种实现方式的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

检测出来,不过二分法的概念还是很好理解的,主要思想是:(设查找的数组区间为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 ;        
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值