实验要求
分别用递归和非递归方法实现二分查找
代码
#include <stdio.h>
#define MAXSIZE 10
#define NotFound 0
typedef int Position;
typedef int ElemtType;
typedef struct LNode* List;
struct LNode {
ElemtType Data[MAXSIZE];
Position Last;/*保存数组中的最后一个元素*/
};
ElemtType BinarySearch(List L, ElemtType X, Position Left, Position Right);
Position BS(List L, ElemtType X);
List Input(List L);
int main()
{
List L=(List)malloc(sizeof(struct LNode));
Position i,j;/*i为递归实现返回值,j为非递归实现返回值*/
ElemtType X;
L = Input(L);
scanf_s("%d", &X);
i = BinarySearch(L, X, 1, L->Last);
j = BS(L, X);
printf("%d\n", i);
printf("%d\n", j);
}
/*递归实现*/
Position BinarySearch(List L, ElemtType X, Position Left, Position Right)
{
int mid;
mid = (Left + Right) / 2;
if (L->Data[mid] > X)
return BinarySearch(L, X, Left, mid - 1);
else if (L->Data[mid] < X)
return BinarySearch(L, X, mid + 1, Right);
else if (L->Data[mid] == X)
return mid;
else return NotFound;
}
/*非递归实现*/
Position BS(List L, ElemtType X)
{
Position Left, Right, Mid;/*left为左边界下标,right为右边界下标,mid为中间元素下标*/
Left = 1;
Right = L->Last;
while (Left < Right)
{
Mid = (Left + Right) / 2;
if (L->Data[Mid] < X)
Left = Mid + 1;
else if (L->Data[Mid] > X)
Right = Mid - 1;
else if (L->Data[Mid] == X)
return Mid;
}
return NotFound;
}
List Input(List L)/*数据输入函数(从下标1开始输入)*/
{
int i;
scanf_s("%d", &L->Last);
for (i = 1; i <= L->Last; i++)
scanf_s("%d", &L->Data[i]);
return L;
}