Tengo un problema con un ejercicio y no se como solucionarlo.
El problema es que el código hace cada vez una cosa diferente:
- Se queda colapsado
- Se para y no realiza bien todo lo que tiene que hacer
- Da un error del tipo: ArrayOutIndexException
- Funciona correctamente
Dejo el código a ver si alguien puede ayudarme:
Clase principal
Código
package quicksort; import java.util.Stack; import java.util.Arrays; public class QuicksortTarea { static Stack<int[]> pila = new Stack<int[]>(); static int[] numeros = { 11, 25, 3, 9, 4 }; imprimirArrayNumeros(numeros); controlPilas(); // Mostramos el array ordenado imprimirArrayNumeros(numeros); } // Método que muestra el array de números public static void imprimirArrayNumeros(int numeros[]) { for (int contador = 0; contador < numeros.length; contador++) { } } public synchronized static void controlPilas() { //Introducimos la primera tarea en la pila int[] paso1 = new int[3]; paso1 [0] = 0; paso1 [1] = numeros.length-1; //Indica si tiene thread 0 - NO / 1 - SI paso1 [2] = 0; pila.add(paso1); while (!pila.isEmpty()) { while (pila.get(pila.size()-1)[2] == 0) { ThreadTarea tarea = new ThreadTarea(pila, numeros, pila.get(pila.size()-1)[0], pila.get(pila.size()-1)[1]); tarea.start(); pila.get(pila.size()-1)[2] = 1; } } } }
Clase Thread
Código
package quicksort; import java.util.Arrays; import java.util.Stack; Stack<int[]> pila; int[] array; int izquierda; int derecha; public ThreadTarea(Stack<int[]> pila, int[] array, int izquierda, int derecha) { this.pila = pila; this.array = array; this.izquierda = izquierda; this.derecha = derecha; } //Stack<int[]> pila, int[] array public void run() { //Guardamos los primeros valores de la pila int min = pila.get(pila.size()-1)[0]; int max = pila.get(pila.size()-1)[1]; //Usamos como pivote el valor de la izquierda int pivote = array[izquierda]; //Creamos un boolean para comprobar el lado del array en el que estamos, siendo lado izquierdo = true y lado derecho = false boolean lado = false; while (izquierda < derecha) { if (lado == true) { if (array[izquierda] <= pivote) { izquierda++; } else { array[derecha] = array[izquierda]; derecha--; lado = false; } } else { if (array[derecha] > pivote) { derecha--; } else { array[izquierda] = array[derecha]; izquierda++; lado = true; } } } //Cambiamos el pivote de lado array[derecha] = pivote; // Comprobamos si necesitamos añadir nuevas tareas a la pila if (izquierda > min) { int[] paso2 = new int[3]; paso2 [0] = min; paso2 [1] = izquierda-1; paso2 [2] = 0; pila.add(paso2); } if (derecha < max-1) { int[] paso3 = new int[3]; paso3 [0] = derecha+1; paso3 [1] = max; paso3 [2] = 0; pila.add(paso3); } //Eliminamos la tarea de la pila porque ya se ha utilizado pila.remove(pila.size()-1); } }
Gracias de antemano.