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
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 Threadpackage 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.
Buenos días, de nuevo.
Al final he conseguido solucionar los problemas, era un problema de sincronización de la pila. Pero ahora tengo otro:
- El programa funciona perfectamente con el código que aquí pongo, el problema viene cuando quiero darle un tamaño determinado al array o incluso poner otros números, no llega a salir del bucle de la clase principal con lo cual no muestra el mensaje del array ordenado.
Pongo aquí el código actual a ver si alguien consigue decirme porque no llega a finalizar el programa. Gracias de antemano.
Clase principal package quicksort;
import java.util.Stack;
import java.util.Arrays;
public class QuicksortTarea {
static Pila pila = new Pila ();
static int[] numeros = {11, 2, 3, 8, 4, 1, 10};
// static int[] numeros = new int [8];
static ThreadTarea tarea;
// rellenarArray(numeros);
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 rellena el array con números aleatorios
public static void rellenarArray(int numeros[]) {
for (int contador = 0; contador < numeros.length; contador++) {
numeros[contador] = numeroAleatorio();
}
}
//Método que devuelve un número aleatorio
public static int numeroAleatorio() {
int num
= (int) (Math.
random() * 10); return num;
}
//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
] + " "); }
}
//Método control tarea pilas
//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;
//Añadimos el array de la tarea a la pila
pila.masTarea(paso1);
//Mientras la pila este llena
while (pila.llena() == false) {
//Si la posición donde se indica el thread es 0, lo creamoos
while (pila.dimo()[2] == 0) {
tarea = new ThreadTarea(pila, numeros);
tarea.start();
//Cambiamos el valor
pila.dimo()[2] = 1;
}
tarea.sleep(200);
}
}
}
Clase Threadpackage quicksort;
import java.util.Arrays;
import java.util.Stack;
public class ThreadTarea
extends Thread { //Pila y array
static Pila pila = new Pila ();
int[] array;
/**
* Constructor del thread
*/
public ThreadTarea(Pila pila, int[] array) {
this.pila = pila;
this.array = array;
}
/**
* Método del run del thread
*/
@Override
public void run() {
//Asignamos los valores de inicio y final de la pila
int izquierda = pila.dimo()[0];
int derecha = pila.dimo()[1];
//Guardamos los primeros valores de la pila en otras variables para despues
int min = pila.dimo()[0];
int max = pila.dimo()[1];
//Usamos como pivote el valor de la izquierda
int pivote = array[izquierda];
//Boolean para controlar los lados que colocamos
boolean lado = false;
//Mientras izquierda sea menor o igual que derecha
while (izquierda != derecha) {
//Lado izquierdo
if (lado) {
if (array[izquierda] <= pivote) {
izquierda++;
}
else {
array[derecha] = array[izquierda];
derecha--;
lado = false;
}
}
//Lado derecho
else {
if (array[derecha] > pivote) {
derecha--;
}
else {
array[izquierda] = array[derecha];
izquierda++;
lado = true;
}
}
}
//Intecambiamos los números
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.masTarea(paso2);
System.
out.
println(" SEGUNDA TAREA "); }
if (derecha < max-1) {
int[] paso3 = new int[3];
paso3 [0] = derecha+1;
paso3 [1] = max;
paso3 [2] = 0;
pila.masTarea(paso3);
System.
out.
println(" TERCERA TAREA "); }
//Eliminamos la tarea de la pila porque ya se ha utilizado
pila.quitarTarea(pila.size());
}
}
Clase Pilapackage quicksort;
import java.util.Stack;
public class Pila {
static Stack
<int
[]> pila
= new Stack <int
[]>(); static int dim = pila.size();
public Pila() {
super();
}
public synchronized static int[] dimo() {
return pila.get(pila.size()-1);
}
public synchronized void masTarea (int [] tarea) {
pila.add(tarea);
}
public synchronized void quitarTarea (int tam) {
if (pila.size() >= 1) {
pila.remove(tam);
}
else {
return;
}
}
public synchronized boolean llena (){
if (pila.isEmpty()) {
return true;
}
else {
return false;
}
}
public synchronized int size() {
if (pila.size() >= 1) {
return dim;
}
else {
return 0;
}
}
public synchronized int[] get(int i) {
return null;
}
}