实验六:折半查找

  • 格式:doc
  • 大小:68.50 KB
  • 文档页数:4

《数据结构》实验报告六
实验内容: 折半查找
学号: 20105101132 姓名: 许丽敏
一、上机实验的问题和要求(需求分析):
[ 题目 ] 设有关键字序列k={ 5 ,14 ,18 ,21 ,23 ,29 ,31 ,35 }。从键盘输入
上述8个整数,存放在数组bub[8]中,并进行遍历,输出其值。用折半查找的
方法分别查找21,25,输出查找结果。
二、程序设计的基本思想,原理和算法描述:
在有序(设为升序)表中,取中间元素作为比较对象,若给定值与中间元素的关
键字相等,则查找成功;若给定值小于中间元素的关键字,则在中间元素的左半
区继续查找;若给定值大于中间元素的关键字,则在中间元素的右半区继续查找。
不断重复上述查找过程,直到查找成功,或所查找的区域无该数据元素,查找失
败。

三、调试和运行程序过程中产生的问题及采取的措施:
1.表中SST.elem[i].key的使用
四、源程序及注释
[ 源程序 ] 程序名:实验六:折半查找.cpp
# include
# include

# define OVERFLOW -1
# define EQ(a,b) ((a)==(b))
# define LT(a,b) ((a)<(b))
# define LQ(a,b) ((a)<=(b))

typedef int KeyType;
typedef struct ElemType
{
KeyType key;
}ElemType;
typedef struct SSTable
{
ElemType *elem;//数据元素存储空间基址,建表时按实际长度分配,0号单
元留空
int length;//表长度
}SSTable;
void Create_SSTable(SSTable &ST,int r[],int n)
{//操作结果:由含n个数据元素的数组r构造有序静态顺序查找表ST
int i;
ST.elem=(ElemType *)calloc(n+1,sizeof(ElemType));//动态生成n+1个数
据元素空间(0号单元不用)
if(!ST.elem)
exit(OVERFLOW);
for(i=1;i<=n;i++)
ST.elem[i].key=r[i-1];//将数组r的值依次赋给ST
ST.length=n;
}
void Traverse(SSTable ST)
{
int i;
for(i=1;i<=ST.length;i++)
printf("%4d",ST.elem[i]);
}

int Search_Bin(SSTable ST,KeyType key)
{//在有序表ST中折半查找关键字等于key的数据元素,若找到,则函数值为该
元素在表中的位置,否则为0
int low,high,mid;
low=1;
high=ST.length;//置区间初值
while(low<=high)
{
mid=(low+high)/2;
if(EQ(key,ST.elem[mid].key))
return mid;//找到待查元素
else
if(LT(key,ST.elem[mid].key))
high=mid-1;//在前半区间进行查找
else
low=mid+1;//在后半区间进行查找
}
return 0;
}
//**************************以下是主函数**********************************
void main()
{
int N=8;
int i,k,m,bub[8];//键盘上输入的8个数将存放在bub[8]中
KeyType s;
SSTable ST;
printf("初始化数组元素为:\n");
printf("k=");
for(i=0;iscanf("%d",&bub[i]);
Create_SSTable(ST,bub,N);
printf("遍历结果是:\n");
Traverse(ST);
printf("\n");
for(m=0;m<2;m++)
{
printf("请输入要查找的数:\n");
scanf("%d",&s);
printf("操作结果是:\n");
i=Search_Bin(ST,s);
if(i)
printf("%d",i);
else
printf("没找到\n");
printf("\n");
}
}

五、运行结果