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();
}
}
}
}