二分法查找有序循环数组

时间:2022-10-23 19:13:08

有序循环数组类似[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

}