有序循环数组类似[7, 8, 9, 0, 1, 2, 3, 4, 5, 6],即一个有序数组被分割成两部分,两个子数组都是有序的
采用二分法查找指定值的时候,需要判断一下两个情况:
1.首地址到mid地址有序,即array[0] <= array[mid],此时判断目标值target是否在[0, mid]区间
2. 首地址到mid地址前部分有序,即array[0] >= array[mid],此时判断目标值是否在[mid, end]区间
下面看具体代码分析,使用go语言
func search(s []int, target int) int {
low := 0
high := len(s) - 1
for low <= high {
//找到中间元素
mid := low + ((high - low) >> 1)
//如果s[0] < s[mid],即左边数组有序
if s[0] <= s[mid] {
//target在左边有序数组, 相当于mid落在7-9之间
if s[0] <= target && target <= s[mid] {
high = mid - 1
} else {
low = mid + 1
}
} else {//s[0] > s[mid]
//mid落在右边有序数组,相当于在[0,6]之间
if target >= s[mid] && target <= s[high] {
low = mid + 1
} else {
high = mid - 1
}
}
}
return -1
}