今天出去笔试,遇到一道题目让我们用二分法查找一已排好序的数组中的数据,并返回该数据的位置,这
是我第一次碰到使用二分法的编程题,一开始还是有点小慌得,毕竟之前没有写过,怕有些注意点没法试卷中
检测出来,不过二分法的概念还是很好理解的,主要思想是:(设查找的数组区间为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 ;
}