从表尾开始查找, 有两种情况。
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;
}
}