有序表的查找-折半查找
确定待查数据的范围,然后逐步缩小范围直到找到或者找不到为止。
代码实现—非递归
//折半查找(非递归)
int Search_Bin(Table,KeyType key){
low=1;
high=ST.length;
while(low<=high){
mid=(low+high)/2;
if(key==ST.elem[mid].key)
return mid;
else if(key<ST.elem[mid].key)
high=mid-1;
else
low=mid+1;
}
return 0;
}
查找成功时,折半查找的平均查找长度为log(2) (n+1)-1(n>50)
代码实现—递归
//折半查找(递归)
int Search_Bin(Table,low,high,key){
if(low>high)
return 0;
else{
mid=(low+high)/2;
if(key<ST.elem[mid].key)
return Search_Bin(Table,low,mid-1,key);
else if(key>ST.elem[mid].key)
return Search_Bin(Table,mid+1,high,key);
else
return mid;
}
}
索引顺序表查找
将一个表分为若干个子表,对每个子表建立一个索引项,其中包括:最大关键字、第一个记录在表中的位置指针,索引表按关键字有序,表或有序或分块有序(即第二个表的关键字都比第一个表中的大)。
先查找索引表(折半)确定要找的关键字位于哪个子表,再在子表中进行顺序查找。