一、实验目的:
熟悉各种查找算法及其复杂性,能够根据实际情况选择合适的存储结构。
二、实验要求:
算法完善,考虑时间复杂度。
三、实验内容:
编程实现有序顺序表的顺序查找和二分查找算法。
代码段
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef int KeyType;
//数据元素类型定义
typedef struct{
KeyType key;//数据域
}ElemType;
//顺序表的定义
typedef struct{
ElemType *R;//存储空间基地址
int length;//表的当前长度
}SSTable;
//建立顺序表
bool CreateList(SSTable &L)
{ int i;
L.R=new ElemType[MAXSIZE+1]; //分配空间
if (!L.R) return false;
cout<<"请输入线性表的长度,不能大于"<<MAXSIZE<<':'<<endl;
cin>>L.length;
cout<<"请有顺序的输入表中元素:"<<endl;
for(i=1;i<=L.length;i++)
cin>>L.R[i].key;
}
//打印顺序表
void print(SSTable L)
{ int i;
for(i=1;i<=L.length;i++)
if (i==1) cout<<'('<<L.R[i].key;
else cout<<','<<L.R[i].key;
cout<<')'<<endl;
}
//顺序查找
int Search_Seq(SSTable S,KeyType key){
int i;
S.R[0].key=key;//把关键字放在0位置,若找到要查找的数据,则返回数据的位置,否则返回0
for(i=S.length;S.R[i].key!=key;--i);//从后往前找
return i;
}
//折半或二分查找
int Search_Bin(SSTable S,KeyType key){
int low,high,mid;
low=1;high=S.length;//置查找区间初值
while(low<=high){
mid=(low+high)/2;
if(key==S.R[mid].key) return mid;//找到待查元素
else if(key<S.R[mid].key) high=mid-1;//继续在前一子表进行查找
else low=mid+1;//继续在后一子表进行查找
}
return 0;//表中不存在待查元素
}
int main(){
int m,n,x;
SSTable S;
CreateList(S);
cout<<"您建立的表为:\n";
print(S);
cout<<"请按1继续运行程序:";
cin>>x;
while(x){
cout<<"请输入要查找的元素:\n";
cin>>m;
cout<<endl;
cout<<"通过顺序查找:"<<endl;
n=Search_Seq(S,m) ;
cout<<"数据"<<m<<"在表中的位置为:"<<n<<endl;
cout<<endl;
cout<<"通过二分查找:"<<endl;
n=Search_Bin(S,m);
cout<<"数据"<<m<<"在表中的位置为:"<<n<<endl;
cout<<endl;
cout<<"是否继续查找元素?\n";
cout<<"----是[请输入1]----\n";
cout<<"----否[请输入0]----\n";
cin>>x;
}
return 0;
}
实验结果