一、线性表的查找
1.顺序查找
从表的一端开始,依次将记录的关键字和给定的值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败。
2.折半查找
又称二分查找,要求线性表必须采用顺序存储结构,并且表中元素按关键字有序排列。
查找过程为:
a. 如果给定值和中间记录的关键字相等,则查找成功。
b. 如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找。
c. 重复操作,直至查找成功,或在某一步中查找区间为空,则代表查找失败。
function search(st,key){
var low=1;
var high=st.length;
while(low<=high){
var mid=(low+high)/2;
if(key==st[mid]) return key;
else if(key<st[mid]) high=mid-1;
else low=mid+1;
}
return 0;
}
注:循环执行的条件是low<=high,时间复杂度log2(n)。
二、树表的查找
1.二叉排序树的定义
a. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
b. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
c. 它的左、右子树也分别为二叉排序树。
2.二叉排序树的查找
1) 若二叉排序树为空,则查找失败,返回空指针。
2) 若二叉排序树非空,将给定值key与根结点的关键字进行比较:
a. 若key等于关键字,则查找成功,返回根节点地址;
b. 若key大于关键字,则递归查找右子树;
c. 若key小于关键字,则递归查找左子树。