二分查找必须在有序数组中进行,因为只有单调性才能保证每次比较后可靠排除一半数据;无序时无法判断目标位置,导致算法失效或退化为线性搜索;若仅单次查询,排序开销远超直接遍历。

因为二分查找的每一步决策,都依赖“中点值能可靠划分数据范围”这一前提——而只有有序数组才能提供这种确定性。
中点比较失去方向判断依据
在升序数组中,若 arr[mid] ,就能断定目标只可能出现在右半段(因为左半段所有元素 ≤ arr[mid]);反之亦然。这个推理链条成立的根基,是整个数组保持单调性。一旦无序,比如 mid 位置是 5,左边有 10、右边有 3,那么无论 target 是 4 还是 7,都无法凭 arr[mid] 的大小安全排除任一半——算法可能直接跳过目标所在区域。
时间复杂度优势不复存在
二分查找的 O(log n) 效率,来自每次比较都能稳定砍掉一半候选空间。无序时这个“砍半”是盲目的:排除的那半里可能刚好有答案,剩下的一半又得全扫。结果要么出错,要么退化成随机搜索,实际性能甚至不如一次遍历。
排序本身就有成本,不能为了单次查找去排
- 通用排序(如归并、快排)最低要 O(n log n),远超二分本身的 O(log n)
- 计数排序等线性排序只适用于整数且值域小的场景,不通用
- 如果只查一次,直接线性扫描 O(n) 更省事;只有反复查同一组数据时,才值得先排序再二分,或改用哈希表
有些变体看似不要求整体有序,其实另有结构保证
比如找峰值、找旋转排序数组中的值,表面看数组不是单调的,但它们各自存在局部性质(如“mid 比右邻大 → 左侧必有峰值”),仍满足“每次能确定答案必在某一边”的核心条件。这不违背原理,而是把“有序”换成了其他可推导的划分依据。










