应用范围
顺序表或线性链表表示的静态查找表
表内元素之间是无序的
顺序表的定义
struct Table{
ElemType *arr; //表基址
int size; //表中元素的个数
};
Table tb;
在顺序表tb中查找值为key的元素,size == 11,capaticy == 12,0号元素存放需要查找的key值
可以从前往后找:
int
find(int key,int *arr,int size){
//第一次比较 i<=size
for(int i =1;i <= size;++i){
//第二次比较 key == arr[i]
if(key == arr[i]){
return i;
}
}
return 0;
}
也可以从后往前找:
int
find(int key,int *arr,int size){
//第一次比较 i>=1
for(int i = size;i>=1; --i){
//第二次比较 key==arr[i]
if(key == arr[i]){
return i;
}
}
return 0;
}
改进版
上述查找中,不论是从前向后还是从后向前,每次的循环都是需要进行2次比较的,效率不高。
刚才我们已经将0号位置空闲出来了,我们将key值放入0号位置,作为哨兵位。
基本思想:
我们在从后往前遍历这个顺序表时,我们总是会找到key:
要不是在0号位置之后,假设是i下标,我们直接返回return i ,表示找到了
要不最终0号位置key是肯定存在的,表示整个顺序表遍历完,只在哨兵位有,return 0,表示没找到
整个过程我们不要总是去判断遍历会不会越界,因为最终都会找到,最少哨兵位是key值。
int find(int *arr,int size,int key){
int i;
arr[0] = key; //0号为作为哨兵
//只需要比较一次
for(i = size;arr[i] != key;--i); //不要忘记分号
return i;
}
当数据元素特别大的时候,每次循环少进行一次越界判断,这样会节省几乎一般的时间。