顺序表查找

从表尾开始查找, 有两种情况。

1.查到了,从表尾依次往前查找,是否arr[i] == 40;  当i=7时候,arr[i]=40, 则退出循环,return i;

2. 没查到,查找77元素, 把77元素放置在arr[0]位置, 从表尾开始往前移动,每一个元素都不等于77, 直到arr[0]=77, 此时退出循环,  return i; 此时i=0, 表示没找到。 

 

代码实现:

int SeqSearch(int r[], int n, int k){  //参数分别表示待查找数组,数组元素个数,待查找元素 
	
	r[0] = k;            //设置哨兵,让待查找元素为 i=0的元素
	i=n;                 //从末尾往前查找,方便监视越界情况
	
    //开始遍历,如果查到了,则退出循环,返回i,
    //如果没查到,则此时 r[0] = k; 也退出循环,并且返回 i=0, i=0表示没找到,否则返回k元素索引.
    while(r[i]!=k){       
		i--;
	}
	return i;
} 

注意: 对于具有n个元素的顺序表, 查找第 i 个记录时,需进行 n-i+1次,  如上图,n=9, 现在要查找第5个元素, n-i+1 = 9-5+1 = 5;  所以从后往前查找 5次.

顺序表查找优化:

如果查找表中的有元素是有序存放的(递增 / 递减), 那么在查找元素21的时候,如果查找到元素29还没有查到,那29后面的元素一定比21大,就去29结点的左侧去查找,如果没有左子树可以退出循环。

顺序查找的优化(每个元素被查找的概率不等):

可以把被查找的概率大的元素放在更靠前的位置, 这样查找成功的平均查找长度可以缩短, 如果查找失败的长度,变成了遍历,从头查找到尾,所以查找失败的长度就很长。

 

单链表的顺序查找

定义一个移动指针指向第一个元素,进入循环开始查找, 当链表不为空,且没有查找的的时候,指针移向下一个元素, 计数器加1.

最后有两种情况会退出循环:  用 p->data == k 判断是否查到,如果查到了,则此时指针指向的值与查找的值相等, 否则就是没查到。

1. 在链表中查到了,    那么就返回计数器的值。

2. 在链表中没有查到, 那么就返回0.    

int SeqSearch2(node<int> *first, int k){
	node *p = first->next;					//定义一个移动指针 
	int count = 1;							//起始位置是1,因为还有一个头节点 
	while(p!=NULL && p->data != k){			//当链表不空并且没有查到,则p后移,计数器count++; 
		p = p->next;
		count++;
	}									
	
	//如果查到了,会退出循环,如果链表结束了,会退出循环,所以需要判断是哪种情况退出循环。 
	if(p->data == k){    //如果查到了,则返回 count,表示第count个元素 
		return count;
	}else{				//如果没有找到,则返回0; 
		return 0;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值