实验内容
顺序表的顺序查找和折半查找
数据结构定义
算法思想及算法设计
顺序查找:线性表的0号位置不适用,将待查找元素设置为哨兵,从表尾开始进行遍历,当元素与哨兵不相等时,继续向前遍历;当相等时,说明找到,返回该位置下标。
折半查找(非递归): 设置low,high分别指示表头和表尾。当low<high时,执行循环体:设置中间下标mid,每次将待查找元素与mid处的元素相比较,若小于mid处元素,则将high= mid -1;若大于mid处的元素,则将low=mid+1。
折半查找(递归):略,详细实现请看代码。
实验代码
头文件、数据定义及表创建
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
int info;
}SSElement;
typedef struct
{
SSElement* elem;
int length;
}SSTable;
void Create_SS(SSTable &ST)
{
ST.elem=new SSElement[MAXSIZE];
int n;
cout<<"一共输入几个元素:";
cin>>n;
ST.length=n;
cout<<"请依次输入:";
for(int i=1;i<=n;++i) //0号闲置
cin>>ST.elem[i].key;
}
顺序查找
int Search_Seq(SSTable ST,KeyType key)
{
ST.elem[0].key=key;
int i;
for(i=ST.length;ST.elem[i].key!=key;--i);
return i;
}
二分查找(非递归)
int Search_Bin1(SSTable ST,KeyType key)//非递归
{
int low=1,high=ST.length,mid;
while (low<high)
{
mid=(low+high)/2;
if(ST.elem[mid].key==key)
return mid;
else if(key<ST.elem[mid].key)
high=mid-1;
else
low=mid+1;
}
return 0;
}
二分查找(递归)
int Search_Bin2(SSTable ST,KeyType key,int low,int high)
{
int mid=(low+high)/2;
if(low>high)
return 0;
else if(key==ST.elem[mid].key)
return mid;
else if(key<ST.elem[mid].key)
return Search_Bin2(ST,key,low,mid-1);
else
return Search_Bin2(ST,key,mid+1,high);
}
主函数
int main()
{
SSTable ST;
Create_SS(ST);
KeyType k;
cout<<"请输入需要查找的元素:";
cin>>k;
cout<<"该元素下标为:"<<Search_Seq(ST,k)<<endl;
cout<<"折半查找如下:"<<endl;
cout<<"(非递归)该元素下标为:"<<Search_Bin1(ST,k)<<endl;
cout<<"(递归)该元素下标为:"<<Search_Bin2(ST,k,1,ST.length)<<endl;
return 0;
}
分析与总结
顺序查找 | 折半查找 | 对比 |
---|---|---|
从最后一个元素开始,需要逐个元素与哨兵进行比较,直到找到目标才停止。这个算法的时间复杂度为O(n)。 | 将中间元素与需要查找的元素进行比较,若不等,就要缩小分区,进行递归;若相等,返回下标。该算法的时间复杂度为O(logn)。 | 顺序查找没有折半查找的效率高,但是折半查找的前提事要求元素必须有序排列,这无疑增加很大困难。 |