Debes pensar las cosas, no 'solo escribir' ni 'solo oir', la "velocidad" de enseñanza en las univesidades suele ser contraproducente, porque al final solo aprenderías cosas de memoria, sin entenderlas, así que haces bien en preguntar... aunque si por tu propia cuenta lo pensaras despacio un poco, tú mismo descubrirías el proqué.
1 - Veamos al comienzo, la línea:
int fin = modelos.length - 1;
el -1 responde al hecho de que el tamaño de un array indica SIEMPRE la cantidad de elementos que contiene, por ejemplo si dice 10, tiene 10 elementos, pero contados a partir del 0, el último será el índice 9, si fueran 87 elemento, empezando en 0, el último sería el 86, ídem si tuviera 2514 elementos, el último sería el índice 2513, ergo el último índice siempre es: tamaño-1
Si en vez de empezar en 0, empezaras en 5, sería tamaño-1+5, porque para 10 elementos iría desde el 5,6,7,8,9-10,11,12,13,14.
Y si empezara en un índice de valor negativo, (por ejemplo -11 con tamaño 27) el último índice sería: tamaño-1+(-11) = 27-1-11 = 15
(-11,-10,-9,-8,-7; -6,-5,-4,-3,-2; -1,0,1,2,3; 4,5,6,7,8; 9,10,11,12,13; 14,15)
Es decir la fórmula general para conocer el último índice en un array, siempre es: Tamaño-1+límiteInferior. Y dado que la casi absoluta comunidad de lenguajes arranca sus indíces en el 0, la suma del límite inferior es redundante.
2 - Búsqueda dicotómica, (como no), es nombre muy apropiado para libros y universidades, pero es más universal y entendible para todo el mundo (y no solo el mundillo informático), "Búsqueda binaria".
La búsqueda binaria requiere que el array (o el tipo de colección que se utilice) esté ordenada. Luego si se desea buscar un valor concreto, pongamos el 22 y pongamos (que el array de partida tiene 100 elementos, (sí del 0 al 100-1), y que en cada índice contiene casualmente el valor cuyo índice señala: Arr(0) = 0, Arr(1)=1, Arr(2)=2 ... Arr(99)=99, por simplicidad en las comprobaciones)...
3 - Entonces tendremos que (eliminado la morralla que oscurece la sencillez del algoritmo, esto es expresándolo en pseudocódigo):
entero = Funcion BusquedaBinaria(array de enteros Valores(), entero Valor) //el que se busca
entero ini, medio, fin
fin = Tamaño(Valores)-1: ini = 0
Hacer mientras (ini <= fin) //menor o igual que
medio = (ini + fin) \ 2
Si Valores(medio) > Valor luego
fin = medio - 1
Osi Valores(medio) < Valor luego
ini = medio + 1
Sino
devolver medio //valor encontrado
fin si
repetir
// Si no se encuentra el valor puede devolverse el índice evaluado (medio) en negativo,
// queriendo indicar con ello que de existir se alojaría en ese índice
// (es ideal si se quisiera insertar ordenado)
// y eso es mucho mejor que -1, pero si te reclaman devolver -1, pues hale...
Devolver -medio
Fin Funcion
4 - AQUÍ: la devolución de un índice negativo, expresa 'no encontrado', y a la devolución mejor que considerar:
Si Buscarbin(x,y) =-1 luego no hallado
mucho mejor expresarlo así:
Si BuscarBin(x,y)<0 luego no hallado
Y ahora pasando ese array preestablecdio de 100 elementos con valores numerados del 0 al 99 y buscando el valor 22, hagamos paso a paso lo que sucede (que es lo que tu deberías haber hecho, dibujar una tabla y en cada línea anotar los valores que tienen cada variable, así como el resultado de las comparaciones evaluadas (True/False) ):
Previo:
ini=0
fin = 100-1
Primer ciclo
Medio= (0+99)\2 = 49 // hacmeos una división entera, los ínidces siempre son enteros, no decimales, luego 49'5 se trunca en 49.
Ahora la primera comprobación (dentro del bucle):
Si Valores(49) >22 luego //que es la condición que se cumple
fin= (medio-1), = 49-1 = 48, es decir el valor en el medio es mayor que el buscado, nos queda que mirar or debajo del medio, el índice inmediatamente por debajo del medio es justamente: medio -1, ese pasa a ser ahora el fin, el último hasta el que buscaríamos...
Siguiente ciclo:
Medio = (0 + 48)\2= 24
Si Valores(24) > 22 luego //nuevamente se cumple esta condición...
Fin = (24-1) =23 // ahora el límite superior será 1 menos que el valor que ya hemos visto que era superior al buscado.
Siguiente ciclo:
Medio = (0 + 23)\2 = 11
Si Valores(12) > 22 luego // esta vez no se cumple, pasamos a ala sigueinte condición
Osi Valores(11) < 22 luego //si se cumple esta, luego inicio podrá ser ahora mayor que 0, toda vez que ehmos visto que el valor está más arriba que la posición 11.
Ini = (medio +1) = 11+1 = 12 // es decir de existir, estará entre los índices 12 y 23
Siguiente ciclo:
Medio = (12+23)\2 = 17
Si Valores(17) > 22 luego // no se cumple,
Osi Valores(17) < 22 luego
Ini = (medio+1) = 17+1=18
Siguiente ciclo:
Medio = (17+23)\2= 20
Si Valores(20) > 22 luego // no se cumple,
Osi Valores(20) < 22 luego
Ini = (medio+1) = 20+1=21
Siguiente ciclo:
Medio= (21+23)\2= 22
Si Valores(20) > 22 luego // no se cumple,
Osi Valores(20) < 22 luego //Tampoco se cumple, se pasa el caso siguiente que es expresada como ninguno d elos previos:
Devolver Medio // hallado, se devuelve el índice 22, porque contiene el valor 22
Recuerda que por comodidad pusimos en el array como valor el mismo valor numérico que es el índice, luego Valores(22) = 22, que es el valor buscado y está en el índice 22.
Si has seguido las explicaciones paso a paso, el -1, +1 debe quedarte claro, para que sirve en cada caso, para mover el límite al punto deseado (no revisar dos veces valores ya verificados). Seguirá funcionando si pones:
Fin = medio
-1 Ini = medio
+1pero en general requerirá más ciclos y podría darse el caso de entrar en un bucle infinito si al hallar en el siguiente ciclo el punto medio, resultare ser nuevamente el mismo punto medio del ciclo previo, precisamente por no acotar los límites convenientemente.
4 - La última duda, son los símbolos matemáticos (que esto ya tiene tela, en la Universidad y aún no conocer los símbolos matemáticos "Mayor que y Menor que).
Menor que: <
Mayor que: >
Distinto de: <> //desigualdad, no universalmente usado en todos los lenguajes pero matemáticamente es aceptado, gracias a que misteriosamente en el ASCII (cuando el American Standard..., creó la tabla), no se incluyó el símbolo "= tachado" para expresar desigualdad, distinto de...
La forma de no equivocarte es ver que en un extremo hay 2 'puntos'(de los 2 trazos) y en el otro solo 1 (donde comfluyen), luego puesto, escrito el símbolo considera que exige que adónde apuntan los 2 'puntos' se espera que sea mayor que adonde apuntan solo un 'punto' A > B; C < D.