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  */