Buenos días.
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
Clase Thread
Gracias de antemano.
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 (java) [Seleccionar]
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 };
public static void main(String[] args) {
System.out.println("Array de números sin ordenar");
imprimirArrayNumeros(numeros);
controlPilas();
// Mostramos el array ordenado
System.out.println("\nArray de números ordenados");
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++) {
System.out.print(numeros[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 (java) [Seleccionar]
package quicksort;
import java.util.Arrays;
import java.util.Stack;
public class ThreadTarea extends Thread {
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];
System.out.println("\n El pivote es : " + pivote);
//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.