package main
import "fmt"
func search(nums []int, target int) int {
left, right := 0, len(nums)-1
for left <= right {
mid := (left + right) / 2
if nums[mid] == target {
return mid
}
// Check if left half is sorted
if nums[left] <= nums[mid] {
// Check if target is in left half
if nums[left] <= target && target < nums[mid] {
right = mid - 1
} else {
left = mid + 1
}
} else {
// Right half is sorted
if nums[mid] < target && target <= nums[right] {
left = mid + 1
} else {
right = mid - 1
}
}
}
return -1
}
func main() {
nums := []int{4, 5, 6, 7, 0, 1, 2}
target := 0
index := search(nums, target)
if index != -1 {
fmt.Printf("Target %d found at index %d\n", target, index)
} else {
fmt.Printf("Target %d not found\n", target)
}
}
loop to narrow search range until left passes right
mid := (left + right) / 2
find middle index to check
if nums[mid] == target { return mid }
if middle element is target, return index
if nums[left] <= nums[mid] {
check if left half is sorted
if nums[left] <= target && target < nums[mid] { right = mid - 1 } else { left = mid + 1 }
decide to search left half or right half based on target position
else { if nums[mid] < target && target <= nums[right] { left = mid + 1 } else { right = mid - 1 } }
if right half is sorted, decide where to search
Target 0 found at index 4