使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
封面图
•
2025-11-25
•
PHP
249
0
0
0
在 PHP 中,我们可以实现两种查找算法:**顺序查找(线性查找)** 和 **二分查找(折半查找)**。虽然顺序查找通常用于无序数组,但题目中提到“对象可以是一个有序数组”,因此我们可以对顺序查找进行优化,使其在有序数组中也能更高效地运行。 --- ## ✅ 一、顺序查找(Linear Search) 虽然顺序查找一般用于无序数组,但在有序数组中,我们可以在找到目标元素后提前结束搜索,提高效率。 ### 📌 算法思路: - 从数组的第一个元素开始,逐个与目标值比较。 - 如果找到目标值,返回其索引。 - 如果遍历完整个数组都没有找到,返回 -1。 ### 💡 优化点: - 在有序数组中,一旦当前元素大于目标值,就可以提前终止循环(因为数组是升序的)。 ### ✅ PHP 实现: ```php <?php function linearSearch($arr, $target) { // 遍历数组 for ($i = 0; $i < count($arr); $i++) { if ($arr[$i] == $target) { return $i; // 找到目标,返回索引 } // 如果数组是升序的,且当前元素大于目标值,可以提前退出 if ($arr[$i] > $target) { break; } } return -1; // 未找到 } // 示例使用 $sortedArray = [1, 3, 5, 7, 9, 11, 13]; $result = linearSearch($sortedArray, 7); echo "顺序查找结果: " . ($result != -1 ? "找到在索引 $result" : "未找到") . "\n"; ?> ``` --- ## ✅ 二、二分查找(Binary Search) 二分查找是一种高效的查找算法,适用于**已排序数组**。它通过不断将搜索区间对半分割,快速缩小范围。 ### 📌 算法思路: 1. 初始化左边界 `low` 和右边界 `high`。 2. 计算中间索引 `mid`。 3. 比较中间元素与目标值: - 如果相等,返回 `mid`。 - 如果中间元素小于目标值,说明目标在右半部分,调整 `low = mid + 1`。 - 否则,调整 `high = mid - 1`。 4. 重复直到找到目标或搜索区间为空。 ### ✅ PHP 实现: ```php <?php function binarySearch($arr, $target) { $low = 0; $high = count($arr) - 1; while ($low <= $high) { $mid = (int)(($low + $high) / 2); if ($arr[$mid] == $target) { return $mid; // 找到目标,返回索引 } elseif ($arr[$mid] < $target) { $low = $mid + 1; // 目标在右半部分 } else { $high = $mid - 1; // 目标在左半部分 } } return -1; // 未找到 } // 示例使用 $sortedArray = [1, 3, 5, 7, 9, 11, 13]; $result = binarySearch($sortedArray, 7); echo "二分查找结果: " . ($result != -1 ? "找到在索引 $result" : "未找到") . "\n"; ?> ``` --- ## ✅ 总结对比 | 特性 | 顺序查找(Linear Search) | 二分查找(Binary Search) | |--------------|----------------------------------------|------------------------------------------| | 时间复杂度 | O(n) | O(log n) | | 数组要求 | 无序或有序 | 必须是有序数组 | | 效率 | 低 | 高 | | 适用场景 | 小数据集、无序数组 | 大数据集、有序数组 | --- 如果你有特定的数据集或需要进一步扩展(如处理重复元素、返回所有匹配项等),也可以告诉我,我可以继续优化代码。
上一篇:
php 二维数组排序
下一篇:
PHP操作文件的常用函数
标题录入,一次不能超过6条
留言
评论