折半查找(二分查找)
- 折半查找(Binary Searh) 也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构, 而且表中元素按关键字有序排列。在下面及后续的讨论中,均假设有序表是递增有序的。
- 折半查找的查找过程为:从表的中间记录开始, 如果给定值和 中间记录的关键字相等, 则查找成功;如果给定值大于或者小千中间记录的关键字,则在表中大于或小千中间记录的那一半中查找,这样重复操作, 直到查找成功或者在某一步中查找区间为空, 则代表查找失败。
- 折半查找每一次查找比较都使查找范围缩小一半,与顺序查找相 比,很显然会提高查找效率。
- 为了标记查找过程中每一次的查找区间,下面分别用low和high来表示当前查找区间的下界和上界,mid为区间的中间位置。
【算法步骤】
1 :置查找区间初值,low 为 1,high为表长。
2 :当 low 小于等于 high 时, 循环执行以下操作:
• mid取值为 low 和 high 的中间值;
• 将给定值key与中间位置记录的关键字进行比较,若相等则查找成功,返回中间位置 mid ;
• 若不相等则利用中间位置记录将表对分成前、后两个子表 。如果 key 比中间位置记录
的关键字小,则 high 取为 mid - 1 , 否则 low 取为 mid + l 。
3 :循环结束,说明查找区间为空,则查找失败,返回 0。
【算法描述】
int Search_Bin(SSTable ST, KeyType key)
{
low = l;
high = ST.length;
while (low <= high)
{
mid = (low + high) / 2;
if (key == ST.R[mid].key)
return mid;
else if (key < ST.R[mid].key)
high = mid - 1;
else
low = mid + l;
return 0;
}
- 本算法很容易理解,唯一需要注意的是,循环执行的条件是 low <= high , 而不是low < high,因为 low = high 时,查找区间还有最后一个结点,还要进一步比较 。