1. 程式人生 > >二分法查找有序循環數組

二分法查找有序循環數組

分析 之間 情況 bsp urn 判斷 有序 代碼 分割

有序循環數組類似[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

}

二分法查找有序循環數組