Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7º
ESTRUCTURA DE DATOS
SEMESTRE
Agosto-diciembre 2020
Contenido
UNIDAD 5 METODO DE ORDENAMIENTO .................................................................. 3
5.1.1 BURBUJA. .............................................................................................................. 4
Práctica 1. Ordenamiento por burbuja. ........................................................................ 7
Actividad 1 para el estudiante ...................................................................................... 12
5.1.2 QUICKSORT. ....................................................................................................... 12
Práctica 2. ....................................................................................................................... 15
Actividad 2 para el estudiante...................................................................................... 19
5.1.3 SHELLSORT. ....................................................................................................... 20
Práctica 3 ...................................................................................................................... 22
Actividad 3 para el estudiante .............................................................................. 25
5.1.4 RADIX .................................................................................................................... 26
Práctica 4 ...................................................................................................................... 29
5.2 ALGORITMOS DE ORDENAMIENTO EXTERNOS ............................................. 32
5.2.1 INTERCALACIÓN ................................................................................................ 33
5.2.2 MEZCLA DIRECTA ............................................................................................. 34
5.2.3 MEZCLA NATURAL ............................................................................................ 36
Práctica 5 ...................................................................................................................... 39
2
UNIDAD 5 METODO DE ORDENAMIENTO
5.1 ALGORITMOS DE ORDENAMIENTO INTERNOS
principal de la computadora.
Los métodos directos, son los más simples y fáciles de entender, son
3
definirse el tipo de ordenamiento que se quiere ya sea ascendente o
descendente.
5.1.1 BURBUJA.
del arreglo.
2. Generar un segundo ciclo dentro del anterior que inicie desde cero
4
Una vez que los ciclos terminan la estructura debe quedar ordenada d e
2. Generar un segundo ciclo desde el valor del ciclo anterior más uno
Una vez que los ciclos terminan la estructura debe quedar ordenada, la
5
segundo procedimiento, es menor ya que cada pasada que se le da al
elementos menos uno y mientras que ese valor sea mayor o igual
6
Práctica 1. Ordenamiento por burbuja.
burbuja permita ordenas los datos de un arreg lo, la clase debe calcular
7
package unidad5;
/**
*
* @author Angel
*/
public class OrdenarBurbuja {
static String pasa, compara;
public static void ordenar(int [] arreglo){
int pasadas=0;
int comparaciones=0;
for(int i=0;i<arreglo.length;i++){
++ pasadas;
for(int j=0;j<arreglo.length-1;j++){
++ comparaciones;
if(arreglo [j]>arreglo[j+1]){
intercambiar(arreglo,j,j+1);
}
}
}
pasa=pasadas+"";
compara=comparaciones+"";
estadisticas(pasadas, comparaciones);
}
8
for(int i=0;hayCambios;i++){
++pasadas;
hayCambios=false;
for(int j=0;j<arreglo.length-1;j++){
++comparaciones;
if(arreglo[j]>arreglo[j+1]){
intercambiar(arreglo,j,j+1);
hayCambios=true;
}
}
}
estadisticas(pasadas,comparaciones);
}
private static void intercambiar(int []arreglo,int a,int b){
int tmp=arreglo[a];
arreglo[a]=arreglo[b];
arreglo[b]=tmp;
}
private static void estadisticas(int pasadas,int comparaciones){
System.out.println("Pasadas:"+pasadas);
System.out.println("Comparaciones:"+comparaciones);
}
public String Comparar(){
return compara;
}
public String Pasar(){
return pasa;
}
}
(jFrame).
9
Escribe el nombre: Ordenamiento y dar clic en siguiente
10
Como en la unidad se van a desarrollar 4 prácticas se sugiere que se
Diseño de la interfaz
String d = "";
int[] valores = {15, 35, 01, 05, 04, 03, 19, 45, 13, 02, 55, 8, 78, 997,
451, 546, 12, 16, 24, 103, 99, 784, 4541, 15};
Finalmente, dentro del botón se debe agregar el siguiente código:
11
Actividad 1 para el estudiante
5.1.2 QUICKSORT.
12
La descripción del algoritmo para el método de ordenamiento quicksort es
la siguiente:
1. Debe elegir uno de los elementos del arreglo al que llamaremos pivote.
2. Debe acomodar los elementos del arreglo a cada lado del piv ote, de
manera que del lado izquierdo queden todos los menores al pivote y del
lado derecho
subarreglos, uno formado por los elementos del lado izquierdo del pivote,
y otro por los elementos del lado derecho del pivote. 4. Repetir este
opciones:
Se utilizan dos índices: izq, al que llamaremos índice inicial, y der, al que
13
llamaremos índice final. Conociendo estos elementos el algo ritmo
con izq (desde el primer elemento), y por la derecha con der (desde
el último
elemento).
5. Repetir los pasos anteriores hasta que se crucen los índices (izq
intercambiados).
14
Práctica 2. Crear una clase que permita ordenar los datos de un arreglo utilizando
el método Quicksort.
package unidad5;
/**
*
* @author pc
*/
public class QuickSort {
15
}
public static int parteEntera(int[] num, int izq, int der, double pivote
) {
int izqPtr = izq;
int derPtr = der - 1;
while (true) {
while (num[++izqPtr] < pivote)
;
while (num[--derPtr] > pivote)
;
if (izqPtr >= derPtr) {
break;
} else {
intercambio(num, izqPtr, derPtr);
}
}
intercambio(num, izqPtr, der - 1);
return izqPtr;
}
16
return;
} else {
if (num[izq] > num[der - 1]) {
intercambio(num, izq, der - 1);
}
if (num[izq] > num[der]) {
intercambio(num, izq, der);
}
if (num[der - 1] > num[der]) {
intercambio(num, der - 1, der);
}
}
}
}
Componentes de la interfaz
17
Agregar dentro del botón el siguiente código:
// QuickSort
jTextArea2.setForeground(Color.GREEN);
jTextArea2.append("Arreglo original:" + "\n");
for (int i = 0; i < quick.length; i++) {
jTextArea2.append(quick[i] + " ");
}
jTextArea2.setForeground(Color.BLUE);
jTextArea2.append("\n" + "Arreglo ordenado:" + "\n");
s.recQuickSort(quick, 0, quick.length - 1);
for (int i = 0; i < quick.length; i++) {
jTextArea2.append(quick[i] + " ");
}
El resultado es el siguiente:
18
Actividad 2 para el estudiante. Tomando como base el diseño de la interfaz gráfica
de la práctica 2, agregar un cuadro de texto a la misma y que al hacer clic sobre el
botón ordenar muestre en ese cuadro los datos contenidos en el arreglo.
19
5.1.3 SHELLSORT.
de forma definitiva.
Esto permite que un elemento haga p asos más grandes hacia la posición
que debe ocupar. Los pasos múltiples sobre los elementos se hacen con
tamaños de espacio cada vez más pequeños y el último paso del método
primero debe ser generado a partir del tamaño del arreglo entre dos,
20
El procedimiento para aplicar el algoritmo de shel lsort es el siguiente:
1. Este ciclo debe iniciar con la división del tamaño del arreglo entre
dos.
anteriormente.
2. Mientras el control del ciclo sea menor que el tamaño del arreglo.
los elementos.
1. El control de este ciclo debe iniciar con el valor del ciclo anterior.
estas posiciones.
21
3. El control se decremente con el valor d el incremento.
así como: “lo que valgas en esa posición te pongo”. Esto indica que no se
teclado los datos del arreglo que se utilizará para ordenarlo por el método
ShellSort, el programa debe contener una clase llamada ShellSort (la cual
package unidad5;
/**
22
*
* @author pc
*/
public class ShellSort {
public void shellSort( int a[ ]){
for( int gap = a.length / 2; gap > 0; gap = gap == 2 ? 1 : (int) ( g
ap / 2.2 ) ){
for( int i = gap; i < a.length; i++ ){
int tmp = a[ i ];
int j;
for(j = i; j >= gap && tmp < a[ j - gap ] ; j -= gap ){
a[ j ] = a[ j - gap ];
}
a[ j ] = tmp;
}
}
}
public void ordenaShell(int[] v) {
final int N = v.length;
int incremento = N;
do {
incremento = incremento / 2;
for (int k = 0; k < incremento; k++) {
for (int i = incremento + k; i < N; i += incremento) {
int j = i;
while (j - incremento >= 0 && v[j] < v[j - incremento])
{
int tmp = v[j];
v[j] = v[j - incremento];
v[j - incremento] = tmp;
j -= incremento;
}
}
}
} while (incremento > 1);
}
}
23
La otra clase se llama ConsolaShellSort y contiene el m étodo principal
package unidad5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* @author pc
*/
public class ConsolaShellSort {
shell.ordenaShell(arreglo);
for (int i=0;i < arreglo.length;i++){
System.out.print(arreglo[i]+" ");
}
}
}
24
Actividad 3 para el estudiante.
Tomando como base la clase ShellSort, el alumno debe crear una interfaz
deberá solicitar la cantidad de datos a ingresar, así como los valores que
se agregarán al arreglo.
Posible diseño:
Al hacer clic sobre el botón que solicite la cant idad de datos a ingresar
utilizando
JOptionPane.showInputDialog(evento,"")
Posteriormente al dar clic en aceptar solicita la cantidad de datos que
ordenado.
25
5.1.4 RADIX
ocupan dentro del dato. Los datos numéricos los por dígitos y los datos
✓ De derecha a izquierda y
✓ De izquierda a derecha.
26
Si aplicamos este método solo a enteros, el método se clasifica de
la siguiente manera:
El radix LSD procesa los enteros in iciando por el digito menos significativo
El radix MSD procesa los enteros iniciando por el digito más s ignificativo
ella, iniciando desde la cola que controla el digito 0 hasta la cola que
del digito que se esté analizando en ese momento, hasta que termine con
del arreglo.
dígitos del 0 al 9.
27
3. Crear cada posición del arreglo como un objeto que permita
corresponde.
del arreglo.
en el ciclo.
6. Generar un segundo ciclo que se encuentra den tro del primero, al igual
arreglo nuevamente.
28
7. Dentro del ciclo anterior se genera otro ciclo que se encarga de colocar
siguiente código:
package unidad5;
import java.io.*;
import java.util.*;
class Radix {
29
output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
count[ (arr[i]/exp)%10 ]--;
}
crear una aplicación de consola, por lo cual los demás métodos s irven
u otra).
Ahora solo se necesario ejecuta r el programa y ver que los datos del
30
Dentro de la interfaz que se viene trabajando de la unidad 5 hay que
muestra a continuación:
int rad[] = {15, 35, 01, 05, 04, 03, 19, 45, 13, 100, 02, 55, 8, 78, 997, 45
1, 546, 12, 16, 24, 103, 99, 784, 4541, 15};
int nt = rad.length;
31
aplicando el método radixsort al objeto ord, se realiza el ordenamiento y
se muestra el arreglo.
jTextArea4.append("Arreglo original\n");
for (int i = 0; i < nt; i++) {
jTextArea4.append(rad[i] + " ");
}
ord.radixsort(rad, nt);
jTextArea4.append("\nArreglo ordenado\n");
for (int i = 0; i < nt; i++) {
jTextArea4.append(rad[i] + " ");
}
Es importante que en cada una de las prácticas pongan atención a los
nombres de los componentes gráficos p ara que sepan que agregar (por si
ordenación externa.
dispositivo secundario externo (el disco duro, cinta, memori a usb, etc.).
32
Por intercalación de archivos se entiende la unión o fusión de dos o más
repita hasta que uno de los archivos originales llegue hasta el fin, en este
caso, solo resta transcribir los números del archivo que no se ha llegado
5.2.1 INTERCALACIÓN
33
vectores, tablas (arrays), listas enlazadas o árboles, la ordenación se
archivo original.
700, 714, 139, 6, 915, 890 y 717, y los archivos auxiliares F1 y F2. El
seria:
Partición: 1
34
Partición: Se construye tomando un número para cada una de las
particiones
partición va primero
Partición: 2
particiones
Fusión:
Partición: 4
Partición:
Fusión:
Partición: 8
Partición:
35
Fusión:
archivo original y tres archivos auxiliares. De estos cua tro archivos, dos
ordenado.
Ejemplo. Considere el archivo F con los elementos 324, 230, 942, 700,
714, 139, 6, 915, 890 y 717, y los archivos auxiliares F1, F2 y F3. El
36
F: 324, 230, 942, 700, 714, 139, 6, 915, 890, 717
Partición inicial
Fisión-Partición
Fisión-Partición
F2: 717
Fisión-Partición
que solo utiliza tres archivos: el archivo original y dos auxiliar es, el primer
37
de los dos archivos auxiliares. Estos do s pasos se repiten mientras que
700, 714, 139, 6, 915, 890 y 717, y los archivos auxiliares F1 y F2. El
seria:
Partición
Fisión
Partición
Fisión
38
Falta otra pasada y F2 se queda sin valores.
0: Crear Archivo
1: Leer
2: Mezcla Directa
3: Mezcla Natural
4: Intercalacion
5: Salir
package unidad5;
import java.util.*;
import java.io.*;
/**
*
* @author pc
*/
public class Principal {
39
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("Elija una de Las Opciones");
System.out.println("0: Crear Archivo");
System.out.println("1: Leer");
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);
40
FlujoD = new DataOutputStream(new BufferedOutput
Stream(new FileOutputStream(fd)));
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;
41
System.out.println(" ");
} else {
System.out.println("El Archivo Esta Vacio");
}
break;
case 3:
if (n != 0) {
System.out.println("Archvio (mezcla natural)");
TInicio = System.currentTimeMillis();
MN.MezclaNatural(fn);
TFin = System.currentTimeMillis();
BAND2 = true;
tiempo = TFin - TInicio;
System.out.println(" ");
System.out.println("Tiempo De Ejcecucion " + tie
mpo + ".");
} 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);
}
}
42
Agregar al proyecto la clase imprimir, la cual permite leer la información
package unidad5;
/**
*
* @author pc
*/
import java.io.*;
generados.
package unidad5;
/**
*
* @author pc
*/
import java.io.*;
public class intercalacion {
public void Intercalacion(File f1, File f2, File f3, int n) throws IOExc
eption {
int var1 = 0;
int var2 = 0;
43
DataInputStream flujo1 = new DataInputStream(new BufferedInputStream
(new FileInputStream(f1)));
DataInputStream flujo2 = new DataInputStream(new BufferedInputStream
(new FileInputStream(f2)));
44
while (Contador1 < (f2.length() / 4)) {
var2 = flujo2.readInt();
flujo3.writeInt(var2);
Contador1++;
}
}
flujo1.close();
flujo2.close();
flujo3.close();
}
}
package unidad5;
/**
*
* @author pc
*/
import java.io.*;
static void Distribuir(File f, File f1, File f2, int longSec, int numReg
) throws IOException {
int numSec, Resto, i;
45
DataInputStream Flujo = new DataInputStream(new BufferedInputStream(
new FileInputStream(f)));
DataOutputStream Flujo1 = new DataOutputStream(new BufferedOutputStr
eam(new FileOutputStream(f1)));
static void Mezclar(File f1, File f2, File f, int lonSec, int numReg) th
rows 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 BufferedOutputStre
am(new FileOutputStream(f)));
DataInputStream Flujo1 = new DataInputStream(new BufferedInputStream
(new FileInputStream(f1)));
46
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 {
47
Clave2 = Flujo2.readInt();
} catch (EOFException e) {;
}
}
}
Flujo.close();
Flujo1.close();
Flujo2.close();
}
}
ordenamiento.
package unidad5;
/**
*
* @author pc
*/
import java.io.*;
48
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 BufferedInputStre
am(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 BufferedOutputSt
ream(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) {
49
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();
}
}
50
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;
}
}
51
}
try {
Flujo = new DataInputStream(new BufferedInputStream(new FileInpu
tStream(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();
}
}
}
}
52