Бинарный поиск. Найти индекс, которого может и не быть
Дан отсортированный массив, нужно найти индекс элемента, если он не найден, то вернуть -1
К обычному бинарному поиску здесь добавляется еще одно ключевое условие, когда в выбранном подмассиве искомый элемент не найден.
@Test
fun makeSearchTest() {
Assert.assertEquals(2, findIndex(intArrayOf(0, 1, 2), 2))
Assert.assertEquals(0, findIndex(intArrayOf(0, 1, 2), 0))
Assert.assertEquals(0, findIndex(intArrayOf(2, 5, 8, 19, 24), 2))
Assert.assertEquals(-1, findIndex(intArrayOf(), 2))
Assert.assertEquals(-1, findIndex(intArrayOf(1, 3, 5), 2))
}
private fun findIndex(array: IntArray, value: Int): Int {
var start = 0
var end = array.size - 1
while (start <= end) {
val midIndex = start + (end - start) / 2
val midValue = array[midIndex]
val number1 = array[start]
val number2 = array[end]
when {
midValue == value -> return midIndex
number1 >= value && value < midValue -> end = midIndex - 1
value in (midValue + 1)..number2 -> start = midIndex + 1
else -> return -1
}
}
return -1
}
Для последнего примера findIndex(intArrayOf(1, 3, 5), 2)
как раз эта ситуация, когда без добавления условия else -> return -1
на каждой итерации цикл не будет попадать ни в одно из условий when
.