algoritmos de ordenamiento (comparación)

13

Click here to load reader

Upload: octavio-ordaz

Post on 11-Apr-2017

69 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Algoritmos de Ordenamiento (Comparación)

Carlos Octavio Ordaz Bernal

158525

Estructuras de Datos Avanzadas

9 de septiembre 2016

Tarea 2. Comparación de Algoritmos de Ordenamiento

1. Datos Ordenados

Datos Ordenados

n

Cantidad de comparaciones

Inserción Directa

Bubble Sort Quick Sort Merge Sort Shell Sort

10 31.0 45.0 27.0 34.0 61.0

100 2695.0 4950.0 630.0 672.0 2519.0

1000 245978.0 499500.0 11259.0 9976.0 54650.0

10000 25222983.0 49995000.0 154718.0 133616.0 1234153.0

0.0

10000000.0

20000000.0

30000000.0

40000000.0

50000000.0

60000000.0

0 2000 4000 6000 8000 10000 12000

Can

tid

ad d

e C

om

par

acio

nes

n

Datos Ordenados. Cantidad de Comparaciones vs. n

Inserción Directa

Bubble Sort

Quick Sort

Merge Sort

Shell Sort

Page 2: Algoritmos de Ordenamiento (Comparación)

Datos Ordenados

n

Tiempo en milisegundos

Inserción Directa

Bubble Sort Quick Sort Merge Sort Shell Sort

10 1.0 2.0 2.0 1.0 2.0

100 2.0 3.0 2.0 2.0 2.0

1000 33.0 67.0 4.0 5.0 12.0

10000 661.0 852.0 22.0 21.0 75.0

0.0

100.0

200.0

300.0

400.0

500.0

600.0

700.0

800.0

900.0

0 2000 4000 6000 8000 10000 12000

Tiem

po

en

mili

segu

nd

os

n

Datos Ordenados. Tiempo en ms vs. n

Inserción Directa

Bubble Sort

Quick Sort

Merge Sort

Shell Sort

Page 3: Algoritmos de Ordenamiento (Comparación)

2. Orden Invertido

Orden Invertido

n

Cantidad de comparaciones

Inserción Directa

Bubble Sort Quick Sort Merge Sort Shell Sort

10 14.0 45.0 28.0 34.0 53.0

100 2255.0 4950.0 578.0 672.0 2426.0

1000 253522.0 499500.0 12048.0 9976.0 54689.0

10000 24772017.0 49995000.0 164140.0 133616.0 1263157.0

0.0

10000000.0

20000000.0

30000000.0

40000000.0

50000000.0

60000000.0

0 2000 4000 6000 8000 10000 12000

Can

tid

ad d

e C

om

par

acio

nes

n

Orden Invertido. Cantidad de Comparaciones vs. 'n'

Inserción Directa

Bubble Sort

Quick Sort

Merge Sort

Shell Sort

Page 4: Algoritmos de Ordenamiento (Comparación)

Orden Invertido

n

Tiempo en milisegundos

Inserción Directa

Bubble Sort Quick Sort Merge Sort Shell Sort

10 1.0 1.0 1.0 1.0 2.0

100 4.0 4.0 2.0 1.0 2.0

1000 25.0 42.0 5.0 4.0 13.0

10000 615.0 943.0 21.0 20.0 66.0

0.0

100.0

200.0

300.0

400.0

500.0

600.0

700.0

800.0

900.0

1000.0

0 2000 4000 6000 8000 10000 12000

Tiem

po

en

mili

segu

nd

os

n

Orden Invertido. Tiempo en milisegundos vs. 'n'

Inserción Directa

Bubble Sort

Quick Sort

Merge Sort

Shell Sort

Page 5: Algoritmos de Ordenamiento (Comparación)

3. Orden Aleatorio

Datos Aleatorios

n

Cantidad de comparaciones promedio

Inserción Directa

Bubble Sort Quick Sort Merge Sort Shell Sort

100 2470.3 4950.0 647.1 672.0 2693.0

1000 249923.1 499500.0 11079.7 9976.0 58192.5

10000 24969604.3 49995000.0 156303.9 133616.0 1300457.1

0.0

10000000.0

20000000.0

30000000.0

40000000.0

50000000.0

60000000.0

0 2000 4000 6000 8000 10000 12000

Can

tid

ad d

e co

mp

arac

ion

es p

rom

edio

n

Datos Aleatorios. Cantidad de comparaciones promedio vs. n

Inserción Directa

Bubble Sort

Quick Sort

Merge Sort

Shell Sort

Page 6: Algoritmos de Ordenamiento (Comparación)

Datos Aleatorios

n

Tiempo en milisegundos promedio

Inserción Directa

Bubble Sort Quick Sort Merge Sort Shell Sort

100 3.6 6.5 4.1 1.1 3.5

1000 35.4 59.7 9.5 5.3 14.4

10000 628.4 835.5 27.4 22.2 79.6

0.0

100.0

200.0

300.0

400.0

500.0

600.0

700.0

800.0

900.0

0 2000 4000 6000 8000 10000 12000

Tiem

po

en

ms

n

Datos Aleatorios. Tiempo en ms Promedio vs. n

Inserción Directa

Bubble Sort

Quick Sort

Merge Sort

Shell Sort

Page 7: Algoritmos de Ordenamiento (Comparación)

Anexo: Código.

Clase Película

package tarea2; /** * * Carlos Octavio Ordaz Bernal * 08-09-16 */ public class Pelicula implements Comparable { public int folio; public int año; public String titulo; public Pelicula(){ folio = 0; año = 0; titulo = null; } public Pelicula(int folio, int año, String titulo){ this.folio = folio; this.año = año; this.titulo = titulo; } public int getFolio() { return folio; } public void setFolio(int folio) { this.folio = folio; } public int getAño() { return año; } public void setAño(int año) { this.año = año; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; }

Page 8: Algoritmos de Ordenamiento (Comparación)

public String toString(){ StringBuilder cad = new StringBuilder(); cad.append("\nFolio: "+folio); cad.append("\nAño: "+año); cad.append("\nTítulo: "+titulo); cad.append("\n---------------"); return cad.toString(); } public int compareTo(Object o) { Pelicula otro = (Pelicula) o; if(this.folio == otro.folio){ return 0; } else{ if(this.folio > otro.folio){ return 1; } else{ return -1; } } } }

Clase MetodosdeOrdenamiento

package tarea2; /** * * Carlos Octavio Ordaz Bernal * 08-09-16 */ public class MetodosdeOrdenamiento { public static int comp; public static <T extends Comparable <T>> void insercionDirecta(T datos[]){ comp = 0; T temp; int pos, i, j; for(i = 0; i < datos.length; i++){ pos = i; while(pos > 0 && datos[pos].compareTo(datos[pos-1]) < 0){ comp++; temp = datos[pos-1]; datos[pos-1] = datos[pos]; datos[pos] = temp; pos--; } }

Page 9: Algoritmos de Ordenamiento (Comparación)

} public static <T extends Comparable<T>> void ordenamientoBurbuja(T datos[]){ comp = 0; for(int i = 0; i < datos.length; i++){ for(int j = 1; j < datos.length-i; j++){ comp++; if(datos[j].compareTo(datos[j-1])<0){ T temp = datos[j]; datos[j] = datos[j-1]; datos[j-1] = temp; } } } } public static <T extends Comparable<T>> void quickSort(T datos[]){ comp = 0; quickSort(datos,0,datos.length-1); } private static <T extends Comparable<T>> void quickSort(T datos[], int exIzq, int exDer){ int pos; if(exIzq>=exDer){ return; } pos=findPartition(datos,exIzq,exDer); quickSort(datos,exIzq,pos-1); quickSort(datos,pos+1,exDer); } private static<T extends Comparable<T>> int findPartition(T datos[], int exIzq, int exDer){ int pivote=exIzq; int finalito=exDer; int i=exIzq; while(i<finalito){ comp++; if(datos[i].compareTo(datos[i+1])>=0){ T aux=datos[i]; datos[i]=datos[i+1]; datos[i+1]=aux; pivote=i+1; i++; } else{ T aux=datos[i+1]; datos[i+1]=datos[finalito]; datos[finalito]=aux; finalito--; } } return pivote; } public static <T extends Comparable<T>> void mergeSort(T datos[]){

Page 10: Algoritmos de Ordenamiento (Comparación)

comp = 0; mergeSort(datos,0,(datos.length-1)); } private static <T extends Comparable<T>> void mergeSort(T datos[], int min, int max){ T temp[]; int izq,der; if(min==max){ return; } int tam=max-min+1; int mitad=(min+max)/2; temp=(T[])(new Comparable[tam]); mergeSort(datos,min,mitad); mergeSort(datos,mitad+1,max); izq=min; der=mitad+1; for(int i=0; i<tam; i++){ comp++; if(izq<=mitad && der<=max && datos[izq].compareTo(datos[der])<=0){ temp[i]=datos[izq]; izq++; } else if(der<=max){ temp[i]=datos[der]; der++; } else{ temp[i]=datos[izq]; izq++; } } for(int i=0; i<tam; i++){ datos[min+i]=temp[i]; } } public static <T extends Comparable<T>> void shellSort(T datos[]){ comp = 0; int gap, i; T aux; boolean temp; for(gap = datos.length/2; gap!=0; gap/=2){ temp = true; while(temp){ temp = false; for(i = gap; i<datos.length; i++){ comp++; if(datos[i-gap].compareTo(datos[i])>0){ aux = datos[i]; datos[i] = datos[i-gap]; datos[i-gap] = aux; temp = true; }

Page 11: Algoritmos de Ordenamiento (Comparación)

} } } } }

Clase Tarea2

package tarea2; import java.io.FileReader; import java.io.BufferedReader; import java.util.Random; import java.util.StringTokenizer; /** * * Carlos Octavio Ordaz Bernal * 08-09-16 */ public class Tarea2 { public static <T> String imprimeArreglo(T datos[]){ StringBuilder cad = new StringBuilder(); for(int i = 0; i < datos.length; i++){ cad.append(datos[i] + "\t"); } return cad.toString(); } public static int[] valAleatorios (int n){ int[] a = new int[n]; Random rand = new Random(); int val; for(int i = 0; i < n; i++){ val = rand.nextInt(17770); a[i] = val; } return a; } public static void main(String[] args) { String linea; try(BufferedReader br = new BufferedReader(new FileReader("movie_titles2.txt"))){ String[] info; StringTokenizer st; String[] compil[] = new String[17770][3]; Pelicula[] peliculas; int j = 0; while((linea = br.readLine()) != null){

Page 12: Algoritmos de Ordenamiento (Comparación)

st = new StringTokenizer(linea); info = new String[3]; for(int i=0; i<2; i++){ info[i] = st.nextToken(","); } info[2] = st.nextToken("\n").substring(1); compil[j] = info; j++; } //Datos Ordenados // int valor = 10; //Valor deseado para 'n' // peliculas = new Pelicula[valor]; // Pelicula p; // String titulo; // int año, folio; // double tiempoI, tiempoF, tiempoTot; // for(int k=0; k<valor; k++){ // folio = Integer.parseInt(compil[k][0]); // año = Integer.parseInt(compil[k][1]); // titulo = compil[k][2]; // p = new Pelicula(folio, año, titulo); // peliculas[k] = p; // } // tiempoI = System.currentTimeMillis(); // MetodosdeOrdenamiento.insercionDirecta(peliculas); // tiempoF = System.currentTimeMillis(); // tiempoTot = tiempoF-tiempoI; // System.out.println(imprimeArreglo(peliculas)); // System.out.println("Comparaciones: "+MetodosdeOrdenamiento.comp); // System.out.println("Tiempo en ms: "+tiempoTot); //Orden invertido // int valor = 10000; //Valor deseado para 'n' // peliculas = new Pelicula[valor]; // Pelicula p; // String titulo; // int indice = 0; // int año, folio; // double tiempoI, tiempoF, tiempoTot; // for(int k=valor-1; k>-1; k--){ // folio = Integer.parseInt(compil[k][0]); // año = Integer.parseInt(compil[k][1]); // titulo = compil[k][2]; // p = new Pelicula(folio, año, titulo); // peliculas[indice] = p; // indice++; // } // tiempoI = System.currentTimeMillis(); // MetodosdeOrdenamiento.shellSort(peliculas); // tiempoF = System.currentTimeMillis(); // tiempoTot = tiempoF-tiempoI; // System.out.println(imprimeArreglo(peliculas));

Page 13: Algoritmos de Ordenamiento (Comparación)

// System.out.println("Comparaciones: "+MetodosdeOrdenamiento.comp); // System.out.println("Tiempo en ms: "+tiempoTot); //Orden Aleatorio int valor = 10000; //Valor deseado para 'n' peliculas = new Pelicula[valor]; Pelicula p; String titulo; int indice; int año, folio; double tiempoI, tiempoF, tiempoTot; int[] num = valAleatorios(valor); for(int k = 0; k < valor; k++){ indice = num[k]; folio = Integer.parseInt(compil[indice][0]); año = Integer.parseInt(compil[indice][1]); titulo = compil[indice][2]; p = new Pelicula(folio, año, titulo); peliculas[k] = p; indice++; } //System.out.println(imprimeArreglo(peliculas)); tiempoI = System.currentTimeMillis(); MetodosdeOrdenamiento.shellSort(peliculas); tiempoF = System.currentTimeMillis(); tiempoTot = tiempoF-tiempoI; //System.out.println("|||||||||||||||||||||||||"); //System.out.println(imprimeArreglo(peliculas)); System.out.println("Comparaciones: "+MetodosdeOrdenamiento.comp); System.out.println("Tiempo en ms: "+tiempoTot); } catch(Exception e){ System.err.print("Error 404. File Not Found"); } } }