顺序查找法
顺序查找法(Sequential Search)是一种最简单的查找方法,适用于无序或有序的线性表。其基本思想是:从表的一端开始,逐个将记录的关键字与给定值进行比较,直到找到为止或查找结束。
点击“执行一步”观察算法状态变化。
- 适用于数据量较小的线性表
- 适用于无序表或对查找效率要求不高的场合
伪代码如下:
for i = 0 to n-1:
if A[i] == x:
return i // 查找成功,返回下标
default:
return -1 // 查找失败
在顺序表中设置哨兵(把目标值放在下标 0 处),可以省去每轮循环的下标越界判断,提高效率:
// 顺序查找(哨兵版),元素从下标 1 开始存储
int SeqSearch(int A[], int n, int key) {
A[0] = key; // 哨兵
int i;
for (i = n; A[i] != key; i--); // 从后往前比较,无需判断越界
return i; // i==0 表示查找失败
}
设表中每个元素的查找概率相等,均为 。
- 查找成功:比较次数依次为 ,平均比较次数
- 查找失败:需要比较全部 n 个元素后,再比较哨兵,共 次,即
- 最好情况:(第一个元素即为目标)
- 最坏情况:(目标在末尾或不存在)
- 平均情况:
习题 1
给定一个无序数组 ,用顺序查找法查找元素 的位置。
解题思路:
本题考查顺序查找的执行过程。顺序查找从表头开始逐个比较元素,直到找到目标或扫描完整个表,因此目标元素所在的位置直接决定了比较次数。
详细步骤:
- 比较 ,不是
- 比较 ,不是
- 比较 ,不是
- 比较 ,找到目标
最终答案:
在数组下标 处。
习题 2
顺序查找法适合什么样的数据结构?其平均时间复杂度是多少?
解题思路:
本题考查顺序查找的适用条件与效率。顺序查找对表是否有序没有要求,适用范围最广,但代价是必须逐个比较元素,直到找到目标或到达表尾。
详细步骤:
- 顺序查找适用于无序或有序的线性表
- 平均时间复杂度为
- 补充:查找成功时平均比较次数约为 ,查找失败时需要比较全部 个元素,故最坏情况同样是 。
最终答案:
适用于线性表,平均时间复杂度为 。
习题 3
在长度为 的顺序表中查找值为 的元素,若查找成功,将该元素与其后继元素交换;若查找失败,将 插入表中。请写出算法并分析平均时间复杂度。
解题思路:
本题要求设计带交换与插入的顺序查找算法并分析其平均时间复杂度。关键在于:比较次数只取决于表长,与查找成功或失败无关,而交换与插入都是常数时间的操作。
详细步骤:
- 从表头开始顺序查找
- 找到后与后继元素交换
- 未找到则插入表尾
- 平均查找次数 ,失败需 次
- 平均时间复杂度
最终答案:
算法如上,平均时间复杂度为 。
