线性搜索(Linear Search)
概念:
线性搜索是一种简单的查找算法,它从数据结构的一端开始,逐一检查每个元素,直到找到所需的元素或搜索到结构的另一端。
逐步分析:
- 从数组的第一个元素开始,将每个元素与要查找的值进行比较。
- 如果当前元素是所需值,则停止搜索并返回该元素的位置。
- 如果到达数组的末尾仍未找到所需值,则返回一个指示未找到该元素的值(通常为 -1)。
C++ 代码示例:
#include <vector>
// 线性搜索函数
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
,索引i
从0
开始到nums.size() - 1
。 - 如果找到元素
nums[i]
等于target
,则返回相应的索引i
。 - 如果遍历完整个数组都没有找到目标,则返回
-1
。
时间复杂度: O(n),其中 n
是数组的长度。在最坏的情况下,可能需要检查数组中的每个元素。
空间复杂度: O(1),因为搜索过程中不需要额外的存储空间。
是否稳定: 稳定性通常用于排序算法,对于搜索算法来说,不适用。但是线性搜索不会改变包含相同元素的数组的元素顺序。
二分搜索(Binary Search)
概念:
二分搜索是一种在有序数组中查找特定元素的搜索算法。它通过将目标值与数组中间的元素进行比较并根据比较结果缩小搜索范围来工作。
逐步分析:
- 确定数组的中间位置。
- 如果中间的元素是目标值,则搜索结束。
- 如果目标值小于中间元素,则在中间元素的左侧继续搜索。
- 如果目标值大于中间元素,则在中间元素的右侧继续搜索。
- 重复步骤 1-4,直到找到目标值或搜索区间为空。
C++ 代码示例:
#include <vector>
// 二分搜索函数
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
}
代码注释:
- 初始化左右指针
left
和right
,分别指向数组的开始和结束。 - 在
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),二分搜索在原地进行,不需要额外的存储空间。
是否稳定: 稳定性对于搜索算法不适用。不过,二分搜索不会改变数组的元素顺序。