Java - Solución de problemas con MergeSort

   
Vista:

Solución de problemas con MergeSort

Publicado por Alejandro (12 intervenciones) el 18/08/2016 01:27:28
Hola buen día tengan, tengo una duda con respecto a este código, he estado todo el dia y solo no me ejecuta, agradecería si me mostraran mi error y una posible solución, muchas gracias


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.util.Random;
 
public class Merge{
 
	public static int n ;
	public static int cont = 0;
 
	public static void main(String[] args){
 
		System.out.println("Cantidad de numeros a ordenar: ");
		String linea = System.console().readLine();
		n = Integer.parseInt(linea);
 
		int maximo = 1000;
		int[] A = new int[n];
		int[] Ordenado = new int[n];
 
		for(int i=0;i<A.length;i++){
			A[i] = (int)Math.floor(Math.random()*maximo);
		}
 
		// for(int i=0;i<n;i++){
				// System.out.print(" "+A[i]);
		// }
 
		//Mandamos llamar al metodo mergeSort que devuelve un arreglo ordenado
		Ordenado = mergeSort(A);
		System.out.println("");
	/*	
		//Imprimimos el arreglo ordenado
		for(int i=0;i<n;i++){
				System.out.print(" "+Ordenado[i]);
		}
	*/	
 
		//Imprimimos el contador
		System.out.println("\nSe ordenaron "+n+" numeros usando "+cont+" instrucciones");
 
	}
 
 
	public static int[] mergeSort(int[] arreglo){
 
		//Declaramos arreglos para almacenar la mitad izquierda y la mitad derecha del arreglo actual
		//que se este procesando
		int[] mitadIzquierda = new int[arreglo.length/2];
		int[] mitadDerecha = new int[arreglo.length - mitadIzquierda.length];
 
		//con estos dos ciclos dividimos el arreglo en las dos mitades
		for(int i=0;i<mitadIzquierda.length;i++){
			mitadIzquierda[i]=arreglo[i];
		}
 
		for(int j=0;j<mitadDerecha.length;j++){
			mitadDerecha[j]=arreglo[mitadIzquierda.length+j];
		}
 
		//Aqui empieza la recursividad
		//Mandamos llamar a mergeSort para cada una de las mitades y entonces el algoritmo
		//hará lo mismo para cada mitad
		if(arreglo.length > 1){
			cont ++;
 
			cont += 2;
			//El método merge devuelve un arreglo ordenado
			arreglo = merge(mergeSort(mitadIzquierda), mergeSort(mitadDerecha));
			cont++;
			System.out.println(arreglo);
 
		}
 
		cont ++;
		return arreglo;
 
        }
	 public static int[] merge(int[] arreglo2, int[] arreglo3){
		 int i1=0, i2=0,i3=0;
		int[] arreglo1 = new int[n];
 
		while(i2 <= arreglo2[i2] && i3 <= arreglo3[i3]){
		 if (arreglo2[i2]< arreglo3[i3]){
				 arreglo1[i1++] = arreglo2[i2++];
		 }else{
		 arreglo1[i1++] = arreglo3[i3++];
		 }
		 }
 
        return arreglo1;
     }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Solución de problemas con MergeSort

Publicado por xve (261 intervenciones) el 18/08/2016 09:29:41
Hola Alejandro, el problema lo tienes en el método merge()... (linea 80) estas accediendo a un indice de un arreglo que no existe!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar