github.com/maikovskiys/l1tasks@v0.0.0-20230927052451-6436d7687dc9/develop/dev17/main.go (about) 1 package main 2 3 import "fmt" 4 5 /* 6 Реализовать бинарный поиск встроенными методами языка. 7 */ 8 const searchElement = 5 9 10 func main() { 11 arr := []int{1, 2, 3, 4, 5, 6, 7} 12 result := binarySearch(arr, searchElement) 13 fmt.Println(result) 14 } 15 func binarySearch(arr []int, i int) int { 16 left := 0 17 right := len(arr) - 1 18 for left <= right { 19 midIndex := (left + right) / 2 20 midValue := arr[midIndex] 21 if midValue == i { 22 return midIndex 23 } else if midValue < i { 24 left = midIndex + 1 25 } else { 26 right = midIndex - 1 27 } 28 } 29 return 0 30 } 31 32 /* 33 1. Начните с определения границ поиска. Установите начальную границу (left) в начало списка и конечную границу (right) в его конец. 34 35 2. Найдите средний элемент между начальной и конечной границей. 36 37 3. Сравните средний элемент с искомым значением. 38 39 4. Если средний элемент совпадает с искомым значением, возвращаем его индекс (или значение, в зависимости от реализации). 40 41 5. Если средний элемент больше искомого значения, обновите конечную границу (right) на позицию перед средним элементом и перейдите к шагу 2. 42 43 6. Если средний элемент меньше искомого значения, обновите начальную границу (left) на позицию после среднего элемента и перейдите к шагу 2. 44 45 7. Повторяйте шаги 2-6 до тех пор, пока не будет найден искомый элемент или пока начальная граница (left) не станет больше конечной границы (right). 46 47 Бинарный поиск имеет временную сложность O(log n), где "n" - это количество элементов в списке. Это означает, что в худшем случае алгоритм будет выполняться 48 за логарифмическое время, что является значительно более эффективным, чем линейный поиск. 49 */