1.递归结构折半查找
int BSearch(int a[], int x, int low, int high)
{
int mid;
if (low > high)
return -1;
mid = (low + high) / 2;
if (a[mid] == x)
return mid;
else if (x > a[mid])
return BSearch(a, x, mid + 1, high);
else
return BSearch(a, x, low, mid - 1);
}
2.循环结构折半查找
循环结构折半查找利用顺序表完成
需声明如下函数
/*初始化顺序表*/
void ListInitiate(seqlist* s);
/*插入顺序表元素*/
//插入成功返回1,否则返回0
int ListInsert(seqlist* s, int index,int x);
/*折半查找*/
//查找成功返回该元素位置,否则返回-1
int BinarySearch(seqlist s, DataType x);
对顺序表的定义在只之前文章已经写过,此处只介绍折半查找算法
/*折半查找*/
//查找成功返回该元素位置,否则返回-1
int BinarySearch(seqlist s, DataType x)
{
int low = 0, high = s.size - 1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (s.data[mid].key== x.key)
return mid;
else if (s.data[mid].key < x.key)
low = mid + 1;
else if (s.data[mid].key > x.key)
high = mid - 1;
}
return -1;
}
例题:
在保存于数组的 100 个有序数据元素中查 找数据元素 x 是否存在。数据元素 x 要包含两种情况:一种是数据元 素 x 包含在数组中;另一种是数据元素 x 不包含在数组中。
设计出递归算法和循环结构两种实现方法的折半查找函数
1.递归算法实现
#include<stdio.h>
int BSearch(int a[], int x, int low, int high)
{
int mid;
if (low > high)
return -1;
mid = (low + high) / 2;
if (a[mid] == x)
return mid;
else if (x > a[mid])
return BSearch(a, x, mid + 1, high);
else
return BSearch(a, x, low, mid - 1);
}
int main()
{
int a[] = { 1,2,3,4,5,6,7,8 };
int x = 9;
int b;
b = BSearch(a, x, 0, 7);
if (b != -1)
printf("x在数组a中,x的值为%d,下标为%d",x,b);
else
printf("x的值为%d,x不在数组中",x);
}
程序运行结果如下
2.循环结构算法
#include<stdio.h>
#include"seqlist.h" //包含顺序表头文件和折半查找算法
//定义要查找的数据元素(关键字)
typedef int KeyType;
typedef struct
{
KeyType key;
}DataType;
int main()
{
seqlist mylist;
DataType x;
x.key = 8;
int i;
ListInitiate(&mylist);
for ( i = 0; i < MaxSize; i++)
{
ListInsert(&mylist, i, i+1);
}
int a=BinarySearch(mylist, x);
if (a != -1)
{
printf("要查找的元素是%d", mylist.data[a]);
}
else
{
printf("要查找的元素是%d\n", x.key);
printf("元素不在数组中");
}
}
运行结果如下