赞
踩
应用范围
数据元素类型定义
typedef struct
{
Keytype key;//关键字域
InfoType otherinfo;//其他域
}ElemType;
顺序表的定义:
//顺序表结构类型定义
typedef struct
{
ElemType* R;//存储空间基地址
int length;//记录当前表用了多少个数据元素
}SSTable;//Sequential Search Table
SSTable St;//定义顺序表 ST
顺序查找
算法描述
//在顺序表 ST 中顺序查找其关键字等于 key 的数据元素。
//若找到,则函数值为该元素在表中的位置(下标),反之返回0.
int Search_Seq(SSTable St,KeyType key)
{
//从表的最后开始往前找,i指向数组最后一个元素
for(i = St.length;i>=1;i--)
{
if(key == ST.R[i].key)
{
return i;//返回下标
}
}
return 0;
//循环完了还没找到说明里面没有要找的元素。
}
改进:把待查找关键字 key 存入表头(哨兵、监视哨),从后往前逐个比较,可以免去查找过程中每一步都要检查是否检查完毕,加快速度。
算法描述
//在顺序表 ST 中顺序查找其关键字等于 key 的数据元素。
//若找到,则函数值为该元素在表中的下标位置,反之返回0
int Search_Seq(SSTable St,KeyType key)
{
ST.R[0].key = key;
//哨兵,将关键字的值放到下标为0的位置
for(i = St.length;ST.R[i] != key;i--);
//别忘了 for 后面的分号,忘了就完犊子了
return i;
}
【设置监视哨的顺序查找】:时间效率分析
比较次数与 key 的位置有关:
顺序查找的性能分析
记录的查找概率不相等时如何提高查找效率?
记录的查找概率事先不知道时该如何提高查找效率?
顺序查找的特点
查找过程
当前数组内的数据元素是按照升序排序的。
如果要找的值不在数组中:
非递归算法
//二分查找某个值
int serch_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;//将查找区间缩小到 mid 左边
}
else
{
low = mid + 1;//将查找区间缩到 mid 右边
}
}
return 0;
}
折半查找过程可以用二叉树来描述
查找成功
查找不成功
平均查找长度 ASL(成功时)
折半查找特点
分块查找条件
分快查找过程
举个例子
查找效率
举个例子
当 n = 9,s = 3 时
分块查找特点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。