查找算法之顺序查找以及设置哨兵位进行改良

应用范围

顺序表或线性链表表示的静态查找表
表内元素之间是无序的

顺序表的定义

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;
}

当数据元素特别大的时候,每次循环少进行一次越界判断,这样会节省几乎一般的时间。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值