折半查找(二分查找):
折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等, 则查找成功;如果给定值大于或者小于中间记录的关键字, 则在表中大于或小于中间记录的那一半中查找,这样重复操作, 直到查找成功,每一次查找比较都使查找范围缩小一半。
例如:
把当前查找区间的中间位置作为根,树中每一结点对应表中一个记录,但结点值不是记录的关键字,而是记录在表中的位置序号,由此得到的二叉树称为折半查找的判定树
故根据树的性质:折半查找在查找不成功时和给定值进行比较的关键字个数最多也不超过log2(n)取下限+1。
算法效率:
折半查找的时间复杂度为O(log2(n))。
使用前提:要求线性表必须采用顺序存储结构, 而且表中元素按关键字有序排列。
所有折半查找不适用于数据元素经常变动的线性表。
代码如下:
(需要注意的是,循环执行的条件是low<=high,而不是low<high, 因为最后一个结点也需要比较)
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef int InfoType;
//线性表的顺序存储结构
typedef struct
{
KeyType key;
InfoType otherinfo;
}ElemType;
typedef