LMRG En La Red

LMRG En La Red

viernes, 11 de diciembre de 2015

Programa Ordenamiento Externo En Netbeans

El Programa realiza las siguientes funciones cada una dividida en un total de 5 clases llama a la función mediante un menú de opciones, pide al usuario insertar una cantidad n de registros que son generados aleatoriamente y posteriormente aplica las funciones según indique el usuario.

1:Crear Archivo
2:Leeer
3:Mezcla Directa
4:Mezcla Natural
5:Intercalacion
6:Salir (termina el programa)

Clase principal

import java.util.*;
import java.io.*;
public class Principal {
public static void main(String[] args) throws IOException, ClassNotFoundException{       
Scanner sc = new Scanner(System.in);       
String NombreArchivo0 = "original";
String NombreArchivo1 = "mezcla directa";
String NombreArchivo2 = "mezcla natural";
String NombreArchivo3 = "Intercalacion";
String NombreArchivo4 = "1(uno)";
String NombreArchivo5 = "2(dos)";
File f = null;
File fd = null;
File fn = null;
File fi = null;
mezcladirecta MD = new mezcladirecta();
mezclanatural MN = new mezclanatural();
intercalacion IN = new intercalacion();
imprimir IM = new imprimir();       
Random rnd = new Random();
long TInicio, TFin, tiempo;
boolean BAND1 = false, BAND2 = false;  
String opcion, numero;
int op = 0, n = 0, valor;       
do{
try{
System.out.println("");
System.out.println("------------------------------------------------------------");
System.out.println("Selecciona Una De Las Opciones");
System.out.println("0: Crear Archivo");
System.out.println("1: Leeer");
System.out.println("2: Mezcla Directa");
System.out.println("3: Mezcla Natural");
System.out.println("4: Intercalacion");
System.out.println("5: Salir");
System.out.println("------------------------------------------------------------");
opcion = sc.nextLine();
op = Integer.parseInt(opcion);
System.out.println("------------------------------------------------------------");
System.out.println("");
switch(op){
case 0:{
System.out.println("Ingresa La Cantidad De Datos");
numero = sc.nextLine();
n = Integer.parseInt(numero);
f = new File (NombreArchivo0);
fd = new File (NombreArchivo1);
fn = new File (NombreArchivo2);

DataOutputStream FlujoO = null;
DataOutputStream FlujoD = null;
DataOutputStream FlujoN = null;                  
try{
FlujoO = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
FlujoD = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fd)));
FlujoN = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fn)));                      
for (int j = 1; j <= n; j++){
System.out.println("");
System.out.println("Valor  "+j+":");
valor = (int)(rnd.nextDouble()*1000+0);
System.out.println("  "+valor+".");
FlujoO.writeInt(valor);
FlujoD.writeInt(valor);
FlujoN.writeInt(valor);
}
System.out.println("");
System.out.println("Archivo Llenado con exito :3");
FlujoO.close();
FlujoD.close();
FlujoN.close();
}
catch(IOException e){
System.out.println("Error de Entrada/Salida");
}
break;
}
                   
case 1:
if(n != 0){
System.out.println("");
System.out.println("Archivo Original");
IM.Imprimir(f, n);
}
                   
else{
System.out.println("El Archivo Esta Vacio");
}
break;
case 2:
if(n != 0){
TInicio = System.currentTimeMillis();
MD.mdirecta(fd);
TFin = System.currentTimeMillis();
BAND1 = true;
System.out.println("");
System.out.println("Archvio (mezcla directa)");
IM.Imprimir(fd, n);
tiempo = TFin - TInicio;
System.out.println(" ");
}
else{
System.out.println("El Archivo Esta Vacio");
}                   
break;
case 3:
if(n != 0){
TInicio = System.currentTimeMillis();
MN.MezclaNatural(fn);
TFin = System.currentTimeMillis();
BAND2 = true;
tiempo = TFin - TInicio;
System.out.println(" ");
System.out.println("Tiempo De Ejcecucion " + tiempo+".");
}
else{
System.out.println("El Archivo Esta Vacio");
}
break;
case 4:
if(n != 0 && BAND1 == true && BAND2 == true){
System.out.println("");
System.out.println("Archivo");
fi = new File(NombreArchivo3);
fn = fd;                 
TInicio = System.currentTimeMillis();                      
IN.Intercalacion(fd, fn, fi, n);                
TFin = System.currentTimeMillis();
tiempo = TFin - TInicio;
System.out.println("");
}            
else{
System.out.println("Archivo Vacio");
}
break;
}
}
catch(NumberFormatException e){
System.out.println("Ingresa solo caracteres validos");     
}
}  
while(op != 5);    
}
}

Clase imprimir

import java.io.*;
public class imprimir{
public void Imprimir(File f, int n) throws IOException{
DataInputStream FlujoIm = null;
FlujoIm = new DataInputStream(new BufferedInputStream(new FileInputStream(f)));
for (int i = 1; i <= n; i++){
System.out.println(" *"+FlujoIm.readInt()+" ");
}
System.out.println("");

}

Clase Intercalacion

import java.io.*;
public class intercalacion {
public void Intercalacion(File f1,File f2,File f3,int n) throws IOException{
int var1=0;
int var2=0;
DataInputStream flujo1 = new DataInputStream(new BufferedInputStream(new FileInputStream(f1)));
DataInputStream flujo2 = new DataInputStream(new BufferedInputStream(new FileInputStream(f2)));
DataOutputStream flujo3 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f3)));
boolean Bandera1 = true;
boolean Bandera2 = true;
int Contador = 0;
int Contador1 = 0;
while(((Contador< (f1.length()/4)) || (Bandera1==false)) && ((Contador1< (f2.length()/4)) || (Bandera2==false))){
if(Bandera1 == true){
var1 = flujo1.readInt();
Bandera1 = false;
Contador++;
System.out.println(var1);
System.out.println(" ");
}
if(Bandera2 == true){
var2 = flujo2.readInt();
Bandera2 = false;
Contador1++;
System.out.println(var2);
System.out.println(" ");
}
if(var1<var2){
flujo3.writeInt(var1);
Bandera1 = true;
}
else{
flujo3.writeInt(var2);
Bandera2 = true;
}
}
if(Bandera1==false){
flujo3.writeInt(var1);
while(Contador<(f1.length()/4)){
var1=flujo1.readInt();
flujo3.writeInt(var1);
Contador++;
}  
}
if(Bandera2 == false){
flujo3.writeInt(var2);
while(Contador1< (f2.length()/4)){
var2 = flujo2.readInt();
flujo3.writeInt(var2);
Contador1++;
}
}
flujo1.close();
flujo2.close();
flujo3.close();
}  
}

Clase Mezcla directa

import java.io.*;
public class mezcladirecta{
static void mdirecta(File f) throws IOException{
int longSec;
int numReg;       
File f1 = new File ("ArchivoAux1");
File f2 = new File ("ArchivoAux2");     
numReg=(int)f.length()/4;       
longSec = 1;       
while(longSec<numReg){
Distribuir(f, f1, f2, longSec, numReg);
Mezclar(f1, f2, f, longSec, numReg);
longSec *=2;
}
}
static void Distribuir (File f, File f1, File f2, int longSec, int numReg) throws IOException{
int numSec, Resto, i;
DataInputStream Flujo = new DataInputStream(new BufferedInputStream(new FileInputStream(f)));
DataOutputStream Flujo1 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f1)));
DataOutputStream Flujo2 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f2))); 
numSec = numReg /(2*longSec);
Resto = numReg % (2*longSec);       
for(i=1;i<=numSec;i++){
subSecuencia(Flujo, Flujo1, longSec);
subSecuencia(Flujo, Flujo2, longSec);

if(Resto>longSec){
Resto -= longSec;
}       
else{
longSec = Resto;
Resto = 0;
}
subSecuencia(Flujo, Flujo1, longSec);
subSecuencia(Flujo, Flujo2, Resto);
Flujo.close();
Flujo1.close();
Flujo2.close();
}   
static void subSecuencia(DataInput f, DataOutput t, int longSec) throws IOException{
int Clave;
for(int j=1;j<=longSec; j++){
Clave = f.readInt();
t.writeInt(Clave);
}
}   
static void Mezclar(File f1, File f2, File f, int lonSec, int numReg) throws IOException{
int numSec, Resto, i, j, k;
int Clave1 = 0, Clave2 = 0;
numSec = numReg/(2*lonSec);
Resto = numReg % (2*lonSec);
DataOutputStream Flujo = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
DataInputStream Flujo1 = new DataInputStream(new BufferedInputStream(new FileInputStream(f1)));
DataInputStream Flujo2 = new DataInputStream(new BufferedInputStream(new FileInputStream(f2)));
Clave1 =Flujo1.readInt();
Clave2 =Flujo2.readInt();
for(int s=1;s<=numSec+1;s++){
int n1, n2;
n1=n2=lonSec;
if(s==numSec+1){
if(Resto>lonSec){
n2=Resto-lonSec;
}
else{
n1=Resto;
n2=0;
}
}
i=j=1;
while(i<=n1&&j<= n2){
int Clave;
if(Clave1 < Clave2){
Clave = Clave1;
try{
Clave1 = Flujo1.readInt();
}
catch(EOFException e) {;}
i++;
}
else{
Clave = Clave2;
try{
Clave2 = Flujo2.readInt();
}                   
catch(EOFException e) {;}
j++;
}               
Flujo.writeInt(Clave);
}           
for(k=i;k<=n1;k++) {
Flujo.writeInt(Clave1);               
try{
Clave1 = Flujo1.readInt();
}               
catch(EOFException e){;}
}           
for(k=j;k<=n2;k++) {
Flujo.writeInt(Clave2);               
try{
Clave2 = Flujo2.readInt();
}
catch(EOFException e){;}
}
}       
Flujo.close();
Flujo1.close();
Flujo2.close();
}  
}

Clase Mezcla Natural

import java.io.*;
public class mezclanatural{
static final int N = 6;
static final int N2 = N/2;
static File []f = new File[N];
static final int NumReg = 10;
static final int TOPE = 999;

static void MezclaNatural(File fn) throws IOException, ClassNotFoundException{
int i, j, k, k1, t;
int anterior;
int [] c = new int [N];
int [] cd = new int [N];
int [] r = new int [N2];
Object [] Flujos = new Object [N];
DataInputStream FlujoEntradaActual = null;
DataOutputStream FlujoSalidaActual = null;
boolean [] actvs = new boolean [N2];
try{
String [] nomf = {"ar1", "ar2", "ar3", "ar4", "ar5", "ar6"};
for (int x=0;x<N;x++){
f[x] = new File(nomf[x]);
}
t=Distribuir(fn);
for(i=0;i<N;i++){
c[i]=i;
}
do{
k1=(t<N2)?t:N2;
for (i = 0; i < k1; i++){
Flujos[c[i]] = new DataInputStream(new BufferedInputStream(new FileInputStream(f[c[i]])));
cd [i] = c[i];
}
j=N2;
t=0;
for(i=j;i<N;i++){
Flujos [c[i]] = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f[c[i]])));
}
for (int n=0;n<k1;n++){
FlujoEntradaActual = (DataInputStream) Flujos[cd[n]];
r[n] = FlujoEntradaActual.readInt();
}               
while (0 < k1){
t++;                   
for(i=0;i<k1;i++){
actvs [i] = true;
}      
FlujoSalidaActual=(DataOutputStream) Flujos[c[j]];                   
while(!finDeTramos(actvs, k1)){
int n;
n = minimo(r, actvs, k1);
FlujoEntradaActual = (DataInputStream) Flujos[cd[n]];
FlujoSalidaActual.writeInt(r[n]);
anterior=r[n];
try{
r[n] = FlujoEntradaActual.readInt();
if(r[n] < anterior){
actvs[n] = false;
}
}
catch(EOFException e){
k1 --;
FlujoEntradaActual.close();
cd[n] = cd[k1];
r[n] = r[k1];
actvs[n] = actvs[k1];
actvs[k1] = false;
}
}
j=(j<N-1)?j+1:N2;
}
for (i=N2;i<N;i++){
FlujoSalidaActual=(DataOutputStream) Flujos[c[i]];
FlujoSalidaActual.close();
}
for(i=0;i<N2;i++){
int a;
a=c[i];
c[i]=c[i+N2];
c[i + N2]=a;
}
}
while(1<t);
System.out.println(" ARCHIVO ORDENADO:");
escribir(f[c[0]]);
}
catch(IOException er){
er.printStackTrace();
}
}
   
private static int Distribuir(File f0) throws IOException, ClassNotFoundException{
int anterior, j, nt;
int clave;
DataInputStream Flujo = new DataInputStream(new BufferedInputStream(new FileInputStream(f0)));
DataOutputStream [] FlujoSalida = new DataOutputStream[N2];
for(j=0;j<N2;j++){
FlujoSalida[j] = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f[j])));
}
anterior = -TOPE;
clave=anterior+1;
j=0;
nt=0;
try{
while(true){
clave = Flujo.readInt();
while(anterior<=clave){
FlujoSalida[j].writeInt(clave);
anterior = clave;
clave = Flujo.readInt();
}               
nt++;
j=(j<N2-1)?j+1:0;
FlujoSalida[j].writeInt(clave);
anterior = clave;
}
}       
catch(EOFException eof){
nt++;
System.out.println("Numero de tramos "+nt+".");
System.out.println("    ");
Flujo.close();
for(j=0;j<N2;j++){
FlujoSalida[j].close();
}
return nt;
}
}
public static int minimo (int [] r, boolean [] activo, int n){
int i, indice;
int m;
i=indice = 0;
m=TOPE+1;
for(;i<n;i++){
if(activo[i] && r[i] < m){
m=r[i];
indice = i;
}
}
return indice;
}
   
private static boolean finDeTramos(boolean [] activo, int n){
boolean s = true;
for(int k=0;k<n;k++){
if(activo[k]) s = false;
}       
return s;
}
   
static void escribir(File f){
int clave, k;
boolean mas = true;       
DataInputStream Flujo = null;
       
try{
Flujo=new DataInputStream(new BufferedInputStream(new FileInputStream(f)));
k=0;
while(mas){
k++;
System.out.println("* "+Flujo.readInt()+".");
if(k%10==0) System.out.println("");
}
}
catch(IOException eof){
System.out.println("");
try{
if(eof instanceof EOFException)
Flujo.close();
}
catch(IOException er){
er.printStackTrace();
}
}
}
}

No hay comentarios:

Publicar un comentario