Im making a presentation as homework about it, there's barely any information of it, i been working with chatgpt and some youtube video, my question is, whenever i write same numbers, for example, changing the 1 next to a 3, for a 3, so this way 3 and 3 compete, the program ends up leaving a 0 in my finish array, i also need help with any addition you could add to it, or correction. This is my code:
import java.util.Scanner;
class Jugador {
int valor;
public Jugador(int valor) {
this.valor = valor;
}
public int getValor() {
return valor;
}
}
class Nodo {
Jugador jugador;
Nodo izquierda;
Nodo derecha;
public Nodo(Jugador jugador) {
this.jugador = jugador;
}
public Nodo(Nodo izquierda, Nodo derecha) {
this.izquierda = izquierda;
this.derecha = derecha;
}
}
class ArbolTorneo {
Nodo raiz;
public ArbolTorneo(Jugador[] jugadores) {
raiz = construirArbol(jugadores, 0, jugadores.length - 1);
}
private Nodo construirArbol(Jugador[] jugadores, int inicio, int fin) {
if (inicio == fin) {
return new Nodo(jugadores[inicio]);
}
int mitad = (inicio + fin) / 2;
Nodo izquierda = construirArbol(jugadores, inicio, mitad);
Nodo derecha = construirArbol(jugadores, mitad + 1, fin);
Nodo padre = new Nodo(izquierda, derecha);
padre.jugador = seleccionarGanador(izquierda.jugador, derecha.jugador);
return padre;
}
private Jugador seleccionarGanador(Jugador a, Jugador b) {
return (a.getValor() <= b.getValor()) ? a : b;
}
public Jugador obtenerCampeon() {
return raiz.jugador;
}
public void eliminarCampeon() {
int valorCampeon = raiz.jugador.getValor();
reemplazarJugador(raiz, valorCampeon);
recalcularGanadores(raiz);
}
private void reemplazarJugador(Nodo nodo, int valorBuscado) {
if (nodo.izquierda == null && nodo.derecha == null) {
if (nodo.jugador.getValor() == valorBuscado) {
nodo.jugador = new Jugador(Integer.MAX_VALUE);
}
return;
}
reemplazarJugador(nodo.izquierda, valorBuscado);
reemplazarJugador(nodo.derecha, valorBuscado);
}
private void recalcularGanadores(Nodo nodo) {
if (nodo.izquierda == null) {
return;
}
recalcularGanadores(nodo.izquierda);
recalcularGanadores(nodo.derecha);
nodo.jugador = seleccionarGanador(nodo.izquierda.jugador, nodo.derecha.jugador);
}
}
class TournamentSort {
public int[] ordenar(int[] arreglo) {
Scanner leer = new Scanner(System.in);
Jugador[] jugadores = new Jugador[arreglo.length];
for (int i = 0; i < arreglo.length; i++) {
jugadores[i] = new Jugador(arreglo[i]);
}
ArbolTorneo torneo = new ArbolTorneo(jugadores);
int[] salida = new int[arreglo.length];
System.out.println("Iniciando Tournament Sort...");
System.out.println("Presiona ENTER para comenzar.");
leer.nextLine();
for (int i = 0; i < arreglo.length; i++) {
System.out.println("\n===============================");
System.out.println("Ronda " + (i + 1));
Jugador campeon = torneo.obtenerCampeon();
int valorCampeon = campeon.getValor();
if (valorCampeon == Integer.MAX_VALUE) {
// Ya no hay jugadores reales → rompemos el ciclo
break;
}
salida[i] = valorCampeon;
System.out.println("Campeón extraído: " + campeon.getValor());
System.out.print("Arreglo de salida: ");
mostrarArreglo(salida);
torneo.eliminarCampeon();
System.out.println("Presiona ENTER para continuar...");
leer.nextLine();
}
return salida;
}
private void mostrarArreglo(int[] arr) {
System.out.print("[ ");
for (int n : arr) {
if (n == 0) {
System.out.print("_ ");
} else {
System.out.print(n + " ");
}
}
System.out.println("]");
}
}
public class Main {
public static void main(String[] args) {
int[] jugadores = {10, 4, 12, 9, 3, 1, 7, 8};
TournamentSort ts = new TournamentSort();
int[] ordenado = ts.ordenar(jugadores);
System.out.println("\n===============================");
System.out.println("Resultado final ordenado:");
for (int n : ordenado) {
System.out.print(n + " ");
}
}
}
reemplazarJugador(...)does in the broken case for a single invocation ofeliminarCampeon().