从0开始学习C++ 第三十三课 线性搜索和二分搜索

线性搜索(Linear Search)

概念:
线性搜索是一种简单的查找算法,它从数据结构的一端开始,逐一检查每个元素,直到找到所需的元素或搜索到结构的另一端。

逐步分析:

  1. 从数组的第一个元素开始,将每个元素与要查找的值进行比较。
  2. 如果当前元素是所需值,则停止搜索并返回该元素的位置。
  3. 如果到达数组的末尾仍未找到所需值,则返回一个指示未找到该元素的值(通常为 -1)。

C++ 代码示例:

#include 

// 线性搜索函数
int linearSearch(const std::vector<int> &nums, int target) {
    for (int i = 0; i < nums.size(); i++) {
        if (nums[i] == target) {
            return i; // 找到目标,返回索引
        }
    }
    return -1; // 未找到目标,返回-1
}

代码注释:

  • 遍历数组 nums,索引 i0 开始到 nums.size() - 1
  • 如果找到元素 nums[i] 等于 target,则返回相应的索引 i
  • 如果遍历完整个数组都没有找到目标,则返回 -1

时间复杂度: O(n),其中 n 是数组的长度。在最坏的情况下,可能需要检查数组中的每个元素。

空间复杂度: O(1),因为搜索过程中不需要额外的存储空间。

是否稳定: 稳定性通常用于排序算法,对于搜索算法来说,不适用。但是线性搜索不会改变包含相同元素的数组的元素顺序。


二分搜索(Binary Search)

概念:
二分搜索是一种在有序数组中查找特定元素的搜索算法。它通过将目标值与数组中间的元素进行比较并根据比较结果缩小搜索范围来工作。

逐步分析:

  1. 确定数组的中间位置。
  2. 如果中间的元素是目标值,则搜索结束。
  3. 如果目标值小于中间元素,则在中间元素的左侧继续搜索。
  4. 如果目标值大于中间元素,则在中间元素的右侧继续搜索。
  5. 重复步骤 1-4,直到找到目标值或搜索区间为空。

C++ 代码示例:

#include 

// 二分搜索函数
int binarySearch(const std::vector<int> &nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid; // 找到目标,返回索引
        } else if (nums[mid] < target) {
            left = mid + 1; // 在右侧子数组中搜索
        } else {
            right = mid - 1; // 在左侧子数组中搜索
        }
    }
    return -1; // 未找到目标,返回-1
}

代码注释:

  • 初始化左右指针 leftright,分别指向数组的开始和结束。
  • while 循环中,当 left 小于等于 right 时,计算中间位置 mid
  • 如果 nums[mid] 等于 target,返回 mid
  • 如果 target 大于 nums[mid],说明目标值在中间元素的右侧,将 left 移动到 mid + 1
  • 如果 target 小于 nums[mid],说明目标值在中间元素的左侧,将 right 移动到 mid - 1

时间复杂度: O(log n),其中 n 是数组的长度。由于每次比较都会将搜索区间减半,因此搜索效率很高。

空间复杂度: O(1),二分搜索在原地进行,不需要额外的存储空间。

是否稳定: 稳定性对于搜索算法不适用。不过,二分搜索不会改变数组的元素顺序。

目录

你可能感兴趣的:(从0开始学C++,C++,学习,c++,数据结构)