给定由小到大排列的有序数组 a .其中 a 中元素均不相等、数组 b 是 a 的一个循环移动结果,移动了多少位未知。 请设计一个快速算法确定 x 是否存在于数组 b 中(不可以使用数组 a )。要求算法复杂度不高于log2N.请先写出算法的设计思路,再用伪 C 代码进行描述。
时间: 2024-02-06 15:11:34 浏览: 56
有序数组中二分查找,快速寻找某个整数是否在序列中
算法的设计思路:
1. 首先找到数组 b 的最小值,即旋转点,可以使用二分查找来实现;
2. 再根据最小值将数组 b 分成两个有序数组;
3. 判断 x 所在的有序数组(左边或右边);
4. 对该有序数组执行二分查找。
伪代码如下:
```
function search(b: array, n: int, x: int) -> bool:
left, right = 0, n - 1
while left <= right:
mid = (left + right) // 2
if b[mid] == x:
return True
# 判断左边或右边有序数组
if b[left] <= b[mid]:
if b[left] <= x < b[mid]:
right = mid - 1
else:
left = mid + 1
else:
if b[mid] < x <= b[right]:
left = mid + 1
else:
right = mid - 1
return False
```
阅读全文