本题要求实现三种查找算法的比较:线性表查找、监视哨查找、折半查找。
目的: 领会顺序表 三种查找算法的设计,并比较。
内容: 编写程序,实现顺序表的各种基本运算算法,并在此基础上设计一个主程序,完成如下功能:
实现顺序表的基本运算和三种查找算法,具体如下:
随机产生20个0-100以内的数并存入数组dataR;
(1)初始化顺序表L
(2)依次插入数组dataR的元素
(3)输出顺序表L
(4)顺序表L长度
(5)输入要查找的数据(查找成功):sa
(6)线性表查找数据元素sa,返回表中位置、比较的序列、比较次数,并输出
(7)监视哨查找数据元素sa,返回表中位置、比较的序列、比较次数,并输出
(8)折半查找数据元素sa,返回表中位置、比较的序列、比较次数,并输出
(9)输入要查找的数据(查找失败):sb
(10)线性表查找数据元素sb,返回表中位置、比较的序列、比较次数,并输出
(11)监视哨查找数据元素sb,返回表中位置、比较的序列、比较次数,并输出
(12)折半查找数据元素sb,返回表中位置、比较的序列、比较次数,并输出
(13)释放顺序表L
要求:实现下列函数的设计:
int LocateElem_Sq(SqList L, ElemType e ,int &count);
int Search_Seq(SqList ST, int key,int &count);
int Search_Bin(SqList ST,int key,int &count);
void BubbleSort(SqList &L);
函数接口定义:
int LocateElem_Sq(SqList L, ElemType e ,int &count);//算法2.3 顺序表的查找,L为查找的顺序表,e为需查找的数据元素,count为查找次数
/*算法2.3 顺序表的查找,ST为查找的顺序表,key为需查找的数据元素,count为查找次数
在顺序表L中顺序查找其关键字等于e的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
L为查找的顺序表,e为需查找的数据元素,count为查找次数
*/
int Search_Seq(SqList ST, int key,int &count);
/*算法7.2,监视哨查找,
在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
ST为查找的顺序表,key为需查找的数据元素,count为查找次数
*/
int Search_Bin(SqList ST,int key,int &count);
/*算法7.3,折半查找,
在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
ST为查找的顺序表,key为需查找的数据元素,count为查找次数
*/
void BubbleSort(SqList &L);
/*排序算法
为顺序表L进行从小到大排序。折半查找需要对顺序表先排序再查找。
L为排序的顺序表
*/
在这里解释接口参数。例如:其中 N 和 D 都是用户传入的参数。 N 的值不超过int的范围; D 是[0, 9]区间内的个位数。函数须返回 N 中 D 出现的次数。
裁判测试程序样例:
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERF -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
#define MAXSIZE 100 //顺序表可能达到的最大长度
#define MAX 100 //随机产生0-MAX之间的随机数
typedef struct {
ElemType *elem; //存储空间的基地址
int length; //当前长度
} SqList;
Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化
//构造一个空的顺序表L
}
int ListLength_Sq(SqList L)//返回顺序表的长度
{
}
Status GetElem(SqList L, int i, ElemType &e) {//算法2.2 顺序表的取值
}
//顺序表的插入
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{ //算法2.4 顺序表的插入
//在顺序表L中第i个位置之前插入新的元素e
}
//带监视哨的 顺序表插入
Status ListInsert_Sq_m(SqList &L, int i, ElemType e) { //算法2.4 顺序表的插入,
//在顺序表L中第i个位置之前插入新的元素e
}
Status DestroyList_Sq(SqList L){//释放顺序表
}
Status DispList_Sq(SqList L,int beg,int en){//输出顺序表L中的数据元素,从位置beg开始到位置en结束
}
void show_result(int position ,int count, ElemType s)
{
if(position>0)
cout<<" 查找成功!元素在表中位置为:"<<position<<"\t"<<"查找比较的次数为:"<<count<<endl;
else
cout<<" 查找失败!表中不存在元素"<<s<<"。"<<"\t"<<"查找比较的次数为:"<<count<<endl;
}
int main() {
int i,j,count=0,position=0;
SqList L,L_seq,L_bin;
ElemType e;
ElemType dataR[20],sa,sb;
cout<< "请输入一组数据,不超过20个数,以-1为结束符:"<<" ";
j=0;//记录dataR的长度
cin>>e;
while(j>19 ||e!=-1 )
{ dataR[j]=e; //随机产生0-MAX的随机数
j++;
cin>>e;
}
cout<<endl;
cout<<"查找的基本运算如下:\n";
cout<<" (1)初始化顺序表L\n";
InitList_Sq(L);
InitList_Sq(L_seq);
InitList_Sq(L_bin);
cout<<" (2)依次插入数据元素dataR\n";
for(i=0;i<20;i++)
{ ListInsert_Sq(L,i+1, dataR[i]);} //线性顺序表的插入
cout<<" (3)输出顺序表L:";
DispList_Sq(L,1,L.length); //输出顺序表L中的数据元素,从位置1开始到位置length+1结束
cout<<" (4)顺序表L长度:"<< ListLength_Sq(L)<<endl;
//sa=dataR[5];
cout<<" 请输入一个要查找的数sa:\n";
cin>>sa;
position=0;
//顺序查找法
cout<<" (5)查找sa(顺序查找算法):"<<"sa="<< sa<<endl;
cout<<" 顺序查找的比较的数据元素的序列:";
position=LocateElem_Sq(L,sa,count);
cout<<endl;
show_result(position,count,sa);
//监视哨查找法
cout<<" (6)查找sa(监视哨查找算法):"<<"sa="<< sa<<endl;
cout<<" 监视哨查找的比较的数据元素的序列:";
for(i=0;i<20;i++) //空出L.elem[0]的位置做监视哨
{ ListInsert_Sq_m(L_seq,i+2, dataR[i]);} //带监视哨的顺序表的插入
// DispList_Sq(L_seq,2,L_seq.length+1); //输出顺序表L中的数据元素,从位置1开始到位置length+1结束
position=0;
count=0;
position=Search_Seq(L_seq,sa,count);
cout<<endl;
show_result(position,count,sa);
//折半查找算法
cout<<" (7)查找sa(折半查找算法):"<<"sa="<< sa<<endl;
for(i=0;i<20;i++)
{ ListInsert_Sq(L_bin,i+1, dataR[i]);} //线性顺序表的插入
//cout<<" 排序前数据元素的序列为:";
//DispList_Sq(L_bin,1,L.length); //排序前顺序表L中的数据元素,从位置1开始到位置length+1结束
BubbleSort(L_bin);
cout<<" 排序后数据元素的序列为:";
DispList_Sq(L_bin,1,L.length); //输出排序后顺序表L中的数据元素,从位置1开始到位置length+1结束
position=0;
count=0;
cout<<" 折半查找的比较的数据元素的序列:";
position=Search_Bin(L_bin,sa,count);
cout<<endl;
show_result(position,count,sa);
//查找sb,不存在表中的元素
sb=121;
position=0;
count=0;
//顺序查找法
cout<<" (8)查找sb(顺序查找算法):"<<"sb="<<sb<<endl;
cout<<" 顺序查找的比较的数据元素的序列:";
position=LocateElem_Sq(L,sb,count);
cout<<endl;
show_result(position,count,sb);
//监视哨查找法
cout<<" (9)查找sb(监视哨查找算法):"<<"sb="<< sb<<endl;
cout<<" 监视哨查找的比较的数据元素的序列:";
position=0;
count=0;
position=Search_Seq(L_seq,sb,count);
cout<<endl;
show_result(position,count,sb); //监视哨查找失败,比顺序表多比较1次,多的是与监视哨key的比较。
//折半查找算法
cout<<" (10)查找sb(折半查找算法):"<<"sb="<< sb<<endl;
position=0;
count=0;
cout<<" 折半查找的比较的数据元素的序列:";
position=Search_Bin(L_bin,sb,count);
cout<<endl;
show_result(position,count,sb);
cout<<" (12)释放顺序表-L,L_seq,L_bin\n";
DestroyList_Sq(L);
DestroyList_Sq(L_seq);
DestroyList_Sq(L_bin);
return 0;
}
输入样例:
请输入一组数据,不超过20个数,以-1为结束符:。例如:
41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 10 -1
18
105
输出样例:
程序运行输出结果如下:。例如:
请输入一组数据,不超过20个数,以-1为结束符:
查找的基本运算如下:
(1)初始化顺序表L
(2)依次插入数据元素dataR
(3)输出顺序表L:41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 10
(4)顺序表L长度:17
请输入一个要查找的数sa:
(5)查找sa(顺序查找算法):sa=18
顺序查找的比较的数据元素的序列:41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18
查找成功!元素在表中位置为:16 查找比较的次数为:16
(6)查找sa(监视哨查找算法):sa=18
监视哨查找的比较的数据元素的序列:10 18
查找成功!元素在表中位置为:16 查找比较的次数为:2
(7)查找sa(折半查找算法):sa=18
排序后数据元素的序列为:0 5 10 18 24 27 34 41 45 58 61 64 67 69 78 81 91
折半查找的比较的数据元素的序列:45 18
查找成功!元素在表中位置为:4 查找比较的次数为:2
请输入一个要查找的数sb:
(8)查找sb(顺序查找算法):sb=105
顺序查找的比较的数据元素的序列:41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 10
查找失败!表中不存在元素105。 查找比较的次数为:17
(9)查找sb(监视哨查找算法):sb=105
监视哨查找的比较的数据元素的序列:10 18 91 61 27 81 45 5 64 58 78 24 69 0 34 67 41
查找失败!表中不存在元素105。 查找比较的次数为:18
(10)查找sb(折半查找算法):sb=105
折半查找的比较的数据元素的序列:45 67 78 81 91
查找失败!表中不存在元素105。 查找比较的次数为:5
(12)释放顺序表-L,L_seq,L_bin
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++ (g++)
最新发布