Java - Ayuda! metodo de ordenamiento MergeSort

 
Vista:
Imágen de perfil de Nicolas

Ayuda! metodo de ordenamiento MergeSort

Publicado por Nicolas (3 intervenciones) el 05/11/2014 21:03:42
Tengo que entregar mañana un trabajo en mi universidad, el objetivo es que el siguiente código que ordena un archivo de datos llamado Contactos, lo ordena por nombre mediante el método MergeSort de manera iteractiva, lo implemente de forma que ordene de manera RECURSIVA. Porfavor alguien podría ayudarme.

package oad;
import java.io.*;
public class MergeSort {

public static void main(String[] args) throws Exception {
File orig = new File(Constantes.CONTACTOS);
File tmp1 = new File(Constantes.TEMPORAL);
File tmp2 = new File(Constantes.TEMPORAL2);
int numReg = (int) orig.length() / Constantes.LEN_RECORD;
int longSec= 1;
while (longSec < numReg) {
partir(orig, tmp1, tmp2, longSec, numReg);
mezclar(tmp1, tmp2, orig, longSec, numReg);
longSec *= 2;
}
}

private static void partir(File orig, File tmp1, File tmp2, int longSec, int numReg)
throws IOException
{
BufferedInputStream ori = new BufferedInputStream(new FileInputStream(orig));
BufferedOutputStream t1 = new BufferedOutputStream(new FileOutputStream(tmp1));
BufferedOutputStream t2 = new BufferedOutputStream(new FileOutputStream(tmp2));
int numSec = numReg / (2*longSec);
int resto = numReg % (2*longSec);
for (int i = 1; i <= numSec; i++) {
subSecuencia(ori, t1, longSec);
subSecuencia(ori, t2, longSec);
}
if (resto > longSec)
resto -= longSec;
else {
longSec = resto;
resto = 0;
}
subSecuencia(ori, t1, longSec);
subSecuencia(ori, t2, resto);
ori.close();
t1.close();
t2.close();
}

private static void subSecuencia( BufferedInputStream orig,
BufferedOutputStream tmp, int longSec)
throws IOException
{
byte [] registro = new byte [Constantes.LEN_RECORD];
for (int j = 1; j <= longSec; j++) {
orig.read(registro);
tmp.write(registro);
}
}

private static void mezclar ( File tmp1, File tmp2,
File orig, int longSec, int numReg)
throws IOException
{
int numSec = numReg / (2*longSec);
int resto = numReg % (2*longSec);
BufferedInputStream t1 = new BufferedInputStream(new FileInputStream(tmp1));
BufferedInputStream t2 = new BufferedInputStream(new FileInputStream(tmp2));
BufferedOutputStream ori= new BufferedOutputStream(new FileOutputStream(orig));
byte [] registro1 = new byte [Constantes.LEN_RECORD];
byte [] registro2 = new byte [Constantes.LEN_RECORD];
t1.read(registro1);
t2.read(registro2);
for (int s=1; s<=numSec+1; s++) {
String nombre1 = Funciones.arrByte2String(registro1,Constantes.LEN_NOMBRE);
String nombre2 = Funciones.arrByte2String(registro2,Constantes.LEN_NOMBRE);
int n1=longSec;
int n2=longSec;
if (s == numSec+1) {
if (resto > longSec)
n2 = resto - longSec;
else {
n1 = resto;
n2 = 0;
}
}
int i = 1;
int j = 1;
while (i <= n1 && j <= n2) {
if (nombre1.compareTo(nombre2)<0) {
ori.write(registro1);
t1.read(registro1);
nombre1 = Funciones.arrByte2String(registro1,Constantes.LEN_NOMBRE);
i++;
} else {
ori.write(registro2);
t2.read(registro2);
nombre2 = Funciones.arrByte2String(registro2,Constantes.LEN_NOMBRE);
j++;
}
}
for (int k=i; k<=n1; k++) {
ori.write(registro1);
t1.read(registro1);
}
for (int k=j; k<=n2; k++) {
ori.write(registro2);
t2.read(registro2);
}
}
ori.close();
t1.close();
t2.close();
}
}
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