习题1.8 二分查找 (20分)

习题1.8 二分查找 (20分)

思路分析:核心是在已经排序好的数列中找到中位数,然后把要找的数和中位数比较,然后收缩左右边界,最后找到那个数字。
注意要判断这个数是否在这个线性表中,找不到就返回 NotFound

函数接口:
/*#define MAXSIZE 10000
typedef int Position;
typedef struct LNode
{
ElementType Data[MAXSIZE];
Position Last;
}*List;*/
//元素从下标 1 开始存储
//方法一:(采用递归)
Position BS(List L, ElementType X, Position left,Position right)
{
if(left>right) return NotFound;
Position mid = (left+right)/2;
if(X< L->Data[mid]) return BS(L, X, left, mid-1);
else if(X> L->Data[mid]) return BS(L, X, mid+1,right);
else return mid;
}

Position BinarySearch(List L, ElementType X)
{
return BS(L, X, 1, L->Last);
}

//方法二:(采用非递归)
Position BinarySearch(List L, ElementType X)
{
Position left = 1, right = L->Last;
while(left<=right)
{
Position mid = (left+ right)/2;
if(X<L->Data[mid])right = mid-1;
else if(X>L->Data[mid])left = mid+1;
else return mid;
}
return NotFound;
}

猜你喜欢

转载自blog.csdn.net/m0_43429389/article/details/107446979