- 顺序查找(线性查找)
- 折半查找(二分或对分查找)
- 分块查找
顺序查找
typedef struct{ //顺序表结构类型定义
ElemType *R; //表基址
int length; //表长
}SSTable ;
SSTable ST; //定义顺序表ST
int Search_Seq(SSTable ST,KeyType key){
//若成功返回其位置信息,否则返回0
for(i=ST.length;i>=1;--i)
if(ST.R[i].key==key) return i;
return 0;
}
改进:增加“哨兵”,将待查关键字key存入表头
int Search_Seq(SSTable ST,KeyType key){
ST.R[0].key=key;
for(i=ST.length;ST.R[i].key!=key;--i);
return i;
}
顺序查找的特点:
优点:算法简单,逻辑次序无要求,且不同存储结构均适用。
缺点:ASL太长,时间效率太低
折半查找:每次将待查记录所在区间缩小一半
适用于有序线性表
表长n,low,high,mid分别指向待查元素所在区间的上界、下界和中点。key为给定的要查找的值
int Search_Bin(SSTable ST,KeyType key){
low=1;high=ST.length; //置区间初值
while(low<=high){
mid=(low+high)/2;
if(ST.R[mid].key==key) return mid; //找到待查元素
else if(key<ST.R[mid].key) //缩小查找区间
high=mid-1; //继续在前半区间查找
else low=mid+1; //继续在后半区间查找
}
return 0; //顺序表中不存在待查元素
} //非递归
折半查找
优点:效率比顺序查找高
缺点:只适用于有序表,且限于顺序存储结构(对线性链表无效)
分块查找(索引顺序查找)
顺序法查找效率:(n+1)/2
折半法查找效率:log2(n+1)
分块查找效率:log2(n/s+1)+s/2 【s为每块内部记录个数,n/s为块的数目】
优点:插入删除容易,无需进行大量移动
缺点:要增加一个索引表的存储空间并对初始索引表进行排序算法
适用:如果线性表既要快速查找又经常动态变化,则可采用分块查找
查找方法比较
顺序查找 | 折半查找 | 分块查找 | |
---|---|---|---|
ASL(平均查找长度) | 最大 | 最小 | 中间 |
表结构 | 有序表、无序表 | 有序表 | 分块有序 |
存储结构 | 顺序表、线性链表 | 顺序表 | 顺序表、线性链表 |