- 1、本文档共53页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.4 查找和排序
1.4.1 查找(检索)
根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若存在这样一个记录,则查找是成功的,否则是失败的。
查找对象:查找表
查找依据:关键字
查找表
查找表:
同一类待查数据元素(或记录) 构成的集合
关键字
▲关键字(key):
可标识(识别)一个数据元素(或记录)的数据项值
主关键字(primary key) :标识唯一记录
次关键字(secondary key):标识若干记录
查找结果:成功/不成功
查找效率:依赖数据的组织和存储结构
查找效率标准 :
平均查找长度ASL(Average Searching Length)
一.简单查找方法
1.顺序查找
顺序/链式存储结构
elemtype S[MAXNUM]
[算法]
int seq_search(elemtype S[ ], keytype k, int n)
{ int mark=-1;
int i;
for(i=0;in;i++)
{ if (S[i].key==k)
{ mark=i; break;}
}
if(mark==-1)
printf(“Searching failed”);
else
printf(“Searching success”);
return(mark);
}
查找效率
顺序查找效率:
平均查找长度ASL(Average Searching Length)
2.二分查找(折半查找)
查找过程:先确定范围(区间),逐步缩小范围,直到找到/找不到
例:关键字为5,13,19,21,37,56,64,75,80,88,92 查21
[算法27]
int bin_search(elemtype S[ ],keytype k, int n)
{ int low,high,mid;
low=0;
hig=n-1;
while(low=high)
{ mid=(low+high/2);
if(S[mid].key==k)
{ printf(“Searhing success”);
return(mid);
}
else if(S[mid].keyk) high=mid-1;
else low=mid+1;
}
printf(“searching failed”);
return(-1);
}
查找效率:
折半查找的判定树是深度为h的满二叉树
(n50)
注意:只对有序表且顺序存储结构
3.分块查找
建立(最大)索引关键字表
步骤:1.二分查找,确定哪一块
2.块内顺序查找
查找方法比较
二.树表查找
弥补二分法不足(顺序存储结构)
采用二叉排序树
例:关键字序列45,12,53,100,61,90,3,24,如果查100
typedef struct node_data
{ keytype key;
…
} elemtype;
*LC
data
*RC
bs_node
bs_node
bs_node
elemtype
typedef struct bs_node
{ datatype data;
struct bs_node *LC;
struct bs_node *RC:
} bsnode;
bsnode *bs_search(bsnode *t, keytype k)
{ bsnode *S;
if(t==NULL)
{ pintf(“empty tree”);
return(NULL);
}
S=t;
if((S--data).key==k)
{ printf(“Searching success”);
return(S);
}
else if((S--data).keyk)
return(bs_search(S--LC,k));
else
return(bs_search(S--RC,k));
}
查找效率:
与
文档评论(0)