实验内容:在有序顺序表{1,5,9,13,24,26,45,63,78}中分别采用顺序查找、折半查找算法,列出查找关键字5的过程中每次比较的元素。
#include<stdio.h>
#define MAXL 20
typedef int KeyType;
typedef struct
{ KeyType key; /*KeyType为关键字的数据类型*/
//InfoType data; /*其他数据*/
} RecType;
int SeqSearch(RecType R[],int n,KeyType k) //顺序查找
{ int i=0;
printf("用顺序查找法查找关键字%d需依次与以下元素比较:\n",k);
while (i<n && R[i].key!=k) { printf("%d ",R[i].key); i++; } /*从表头往后找*/
if (i>=n)
{ printf("\n"); return 0; }
else
{ printf("%d ",R[i].key); printf("\n"); return i+1; }
}
int BinSearch(RecType R[],int n,KeyType k) //折半查找
{ int low=0,high=n-1,mid;
printf("用折半查找法查找关键字%d需依次与以下元素比较:\n",k);
while (low<=high)
{ mid=(low+high)/2;
if (R[mid].key==k) /*查找成功返回*/
{ printf("%d ",R[mid].key); printf("\n"); return mid+1; }
if (R[mid].key>k) /*继续在R[low..mid-1]中查找*/
{ printf("%d ",R[mid].key); high=mid-1; }
else
{ printf("%d ",R[mid].key); low=mid+1; } /*继续在R[mid+1..high]中查找*/
}
printf("\n");
return 0;
}
void main()
{ RecType r[20];
int i,s,b;
KeyType k;
printf("请输入有序顺序表R的9个元素(用空格分隔):");
for(i=0;i<9;i++)
scanf("%d",&r[i].key);
getchar();
printf("请输入要查找的关键字:");
scanf("%d",&k);
printf("\n顺序查找结果:\n");
s=SeqSearch(r,9,k);
if(s) printf("查找成功,与关键字%d相等的元素位于顺序表R的第%d个位置\n",k,s);
else printf("查找失败,顺序表R中不存在与关键字%d相等的元素\n",k);
printf("\n折半查找结果:\n");
b=BinSearch(r,9,k);
if(b) printf("查找成功,与关键字%d相等的元素位于顺序表R的第%d个位置\n",k,b);
else printf("查找失败,顺序表R中不存在与关键字%d相等的元素\n",k);
}
请输入有序顺序表R的9个元素(用空格分隔):1 5 9 13 24 26 45 63 78
请输入要查找的关键字:5
顺序查找结果:
用顺序查找法查找关键字5需依次与以下元素比较:
1 5
查找成功,与关键字5相等的元素位于顺序表R的第2个位置
折半查找结果:
用折半查找法查找关键字5需依次与以下元素比较:
24 5
查找成功,与关键字5相等的元素位于顺序表R的第2个位置