顺序查找


顺序查找(Sequential Search)

顺序查找(又称线性查找,Linear Search)是一种最简单的查找算法。它的基本思想是 从数据序列的第一个元素开始,依次与目标值进行比较,直到找到匹配项或遍历完整个序列


1. 顺序查找的基本原理

输入:数组 arr 和目标值 target
过程

  1. 从头到尾遍历数组
  2. 逐个元素与 target 进行比较
  3. 如果找到目标值,返回索引;否则返回 -1,表示未找到。

时间复杂度

  • 最优情况(Best Case)O(1)(第一个元素就是目标值)。
  • 最坏情况(Worst Case)O(n)(目标值在最后,或不存在)。
  • 平均情况(Average Case)O(n)

2. 顺序查找的代码实现

(1) 顺序查找(适用于无序数组)

#include <iostream>
using namespace std;

int linearSearch(int arr[], int n, int target) {
    for (int i = 0; i < n; i++) {
        if (arr[i] == target) {
            return i; // 找到目标值,返回索引
        }
    }
    return -1; // 未找到目标值
}

int main() {
    int arr[] = {3, 8, 1, 4, 6, 9, 2};
    int target = 4;
    int n = sizeof(arr) / sizeof(arr[0]);

    int result = linearSearch(arr, n, target);
    if (result != -1) {
        cout << "找到目标值 " << target << ",索引为:" << result << endl;
    } else {
        cout << "目标值 " << target << " 不存在" << endl;
    }

    return 0;
}

优缺点分析

  • 优点:适用于 无序数组,实现简单。
  • 缺点:效率低,时间复杂度最坏为 O(n)

(2) 顺序查找(适用于有序数组,带哨兵优化)

在有序数组中查找时,可以利用哨兵减少比较次数:

  1. 先在数组最后附加目标值(哨兵),避免越界判断。
  2. 找到目标值后,判断是否真的存在(避免哨兵误判)。
#include <iostream>
using namespace std;

int linearSearchWithSentinel(int arr[], int n, int target) {
    arr[n] = target; // 设定哨兵
    int i = 0;
    while (arr[i] != target) {
        i++;
    }
    return (i == n) ? -1 : i;
}

int main() {
    int arr[] = {1, 3, 5, 7, 9}; 
    int target = 7;
    int n = sizeof(arr) / sizeof(arr[0]);

    int result = linearSearchWithSentinel(arr, n, target);
    if (result != -1) {
        cout << "找到目标值 " << target << ",索引为:" << result << endl;
    } else {
        cout << "目标值 " << target << " 不存在" << endl;
    }

    return 0;
}

优化点

  • 哨兵(Sentinel)减少了 i < n 的检查,提高了执行效率
  • 适用于有序数组,但不如二分查找(O(log n))高效

3. 顺序查找 vs. 其他查找算法

查找算法 适用数据 时间复杂度 适用场景
顺序查找 无序数组 O(n) 适用于小规模数据
二分查找(Binary Search) 有序数组 O(log n) 适用于大规模有序数据
跳跃查找(Jump Search) 有序数组 O(√n) 适用于搜索较大的区间
散列表查找(Hash Search) 无序数据 O(1) 适用于键值映射
二叉搜索树(BST)查找 有序数据 O(log n) 适用于动态数据集合

4. 顺序查找的优化方向

  1. 哨兵优化(减少循环内 i < n 的比较)。
  2. 双向查找(从两端向中间查找,提高效率)。
  3. 自适应优化(例如 最近访问的元素放前面,提高下次访问效率)。

总结

  • 顺序查找适用于小规模、无序数据,但 效率低
  • 有序数据应考虑二分查找,哈希表更适合 O(1) 查找
  • 使用哨兵、双向查找可优化顺序查找的效率

顺序查找虽然简单,但仍然有应用价值,在合适场景下能快速实现查找功能!


文章作者: Gustavo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Gustavo !
评论
  目录