简介
顺序查找算法比较简单,在一个线性表中,按照从前往后或者从后往前的顺序依次查找,如果查找到关键字和给定值相等,则返回给定值的位置,查找成功;如果查找值最后一个元素仍未找到,则查找失败。
有一种改进的算法,引入了哨兵的思想,所谓哨兵就是将关键字用一个数组位置去存储,保证在循环的过程中不必判断数组是否越界,因为执行到最后一个元素时,一定会跳出循环。在一定程度上优化了普通查找算法。
// 顺序查找
#include <stdio.h>
int SequentialSearch(int data[],int length, int key);
int SequentialSearchSentry(int data[], int length, int key);
int main(){
int data_sequential[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int data_sequential_sentry[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("%d \n",SequentialSearch(data_sequential, 10, 10));
printf("%d \n",SequentialSearchSentry(data_sequential_sentry, 11, -2));
return 0;
}
//顺序查找的一般形式
//在 data 顺序表中查找到元素 key,返回下标(从 1 开始)
//返回 0 则查找失败
int SequentialSearch(int data[],int length, int key){
int i = 0;
for(i = 0; i < length; ++i){
if(key == data[i]){
return i + 1;
}
}
return 0; //查找失败
}
//有哨兵的顺序查找
//data[0] 是哨兵元素
//在 data 顺序表中查找到元素 key,返回下标(从 1 开始)
//下标从有效数据元素开始计算,即第一个数组元素 data[0] 不参与计算
//返回 0 则查找失败
//length:整个数组的长度,不是有效的数据元素长度
int SequentialSearchSentry(int data[], int length, int key){
int i = length - 1; //从尾部向前查找
data[0] = key;
while(key != data[i]){
--i;
}
return i; //返回查找的结果
}
顺序查找算法整个思路和实现过程都比较简单,理解思路和哨兵思想即可。