Qt Creator编译报错Permission denied?别急着重启,先检查你的代码里有没有这个‘幽灵进程’
2026/5/6 11:10:33
折半查找的核心逻辑是基于“数组有序”的前提,通过不断将查找区间缩小一半来高效定位目标值。其基本步骤如下:
low和high,初始为数组首尾下标。mid = low + (high - low) // 2(避免整数溢出)。key与中间元素arr[mid]:key == arr[mid],查找成功,返回mid;key < arr[mid],说明目标在左半区,更新high = mid - 1;key > arr[mid],说明目标在右半区,更新low = mid + 1;low > high时结束循环,表示未找到,返回-1。defbsearch(arr,key):low,high=0,len(arr)-1whilelow<=high:mid=low+(high-low)//2ifarr[mid]==key:returnmidelifkey<arr[mid]:high=mid-1else:low=mid+1return-1defbsearch_rec(arr,key,low,high):iflow>high:return-1mid=low+(high-low)//2ifarr[mid]==key:returnmidelifkey<arr[mid]:returnbsearch_rec(arr,key,low,mid-1)else:returnbsearch_rec(arr,key,mid+1,high)| 特性 | 描述 |
|---|---|
| 前提条件 | 数组必须有序且支持随机访问 |
| 时间复杂度 | O(log n) —— 显著优于顺序查找的 O(n) |
| 空间复杂度 | 迭代:O(1),递归:O(log n) |
| 适用结构 | 数组等连续存储结构;不适用于链表 |
| 动态操作 | 不适合频繁插入/删除的场景(维护有序成本高) |
折半查找要求数据必须是有序的,是因为其核心逻辑依赖于通过比较中间元素来判断目标值位于左半部分还是右半部分。这种“决策依据”只有在数据有序的前提下才成立。
假设我们有一个数组arr和一个目标值key,折半查找每次都会取中间元素arr[mid]进行比较:
key == arr[mid],查找成功;key < arr[mid],则认为key应该出现在mid左侧 ——但这仅在数组有序时才正确;key > arr[mid],则认为key应该出现在mid右侧 —— 同样依赖于顺序排列。无序数组:[5, 2, 9, 1, 7],我们要找key = 3
中间元素是9,由于3 < 9,算法会去左边[5, 2]查找,但实际上3并不在数组中,即使存在也可能被错误地“跳过”。
而如果是有序数组:[1, 2, 5, 7, 9],中间是5,3 < 5→ 正确进入左半部分[1, 2],继续查找可得结果或确认不存在。
✅ 所以:只有当数组有序时,“小于中间值就一定在左边,大于就在右边”这一推理才成立,否则查找过程将失去正确性。
此外,有序性还保证了以下几点:
就像查字典时,你是按字母顺序翻页的。如果字典的单词被打乱了,你就无法通过“当前词太大”来决定往前翻还是往后翻。