Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Laboratorios de computación
salas A y B
Profesor: Edgar Tista García
Grupo: 10
No de Práctica(s): 1
Semestre: Tercero
Observaciones:
CALIFICACIÓN: __________
Objetivo general: El estudiante identificará la estructura de los algoritmos de ordenamiento
InsertionSort, SelectionSort y BubbleSort.
Objetivo de la clase: El alumno revisará el uso de bibliotecas como capas de abstracción, así́ como
realización de pruebas de los algoritmos para diferentes instancias de colecciones para conocer la
complejidad de estos.
Desarrollo.
I. Análisis inicial.
En el archivo de ordenamiento.c encontramos los algoritmos de insertion sort como selection
sort implementados en el lenguaje de programación C.
Dentro de dichos algoritmos encontramos la instrucción de la impresión del número de iteración
junto con la impresión del estado del array en esa iteración.
En el archivo llamado “utilidades” encontramos las funciones auxiliares que nos ayudarán en la
realización de la práctica 1, como es la función que realiza la operación de intercambio.
También, encontramos la función que imprime el arreglo completo y por último encontramos la
función que imprime una porción determinada de un arreglo ingresado como parámetro.
En mis cursos anteriores he trabajado con funciones similares, por lo que me encuentro
familiarizado con dichas operaciones y dichos algoritmos.
Una vez agregado el algoritmo de bubble sort, se modificó el código para que se detenga en el
momento que la lista se encuentre ordenada. Quedando de la siguiente manera:
II. Probando los ordenamientos.
Línea 3, 4 7 9.
3. n-1
4. n-1
5. …
9. n-1
Ya que se encuentran inmediatamente dentro de un for, estas van a depender de la
comparación de la línea 2, lo cual significa que se ejecutarán una vez menos que la
comparación (n-1).
Líneas 5 a 7
5. (n-1) + (n-1)
6. 0
7. 0
La línea 6 y 7 dependen de la 5, si ambas condiciones son verdaderas, se ejecutarán las
líneas 6 y 7.
Ya que es el mejor de los casos, los arreglos se encuentran ordenados, por lo que la
línea 5 se ejecutará solo una vez por iteración (ambas condiciones) y las líneas 6 y 7 no
se ejecutarán.
Línea 2.
Regresando a la línea 2, notamos que se encuentra un incremento, y ya que, este
depende de la condición de la línea 2, se ejecutará n-1 veces. Por lo que el análisis del
mejor de los casos de insertion sort quedaría de la siguiente manera:
1.3
2.1+n+(n-1)
3.n-1
4.n-1
5.n-1 + n-1
6.0
7.0
8….
9.n-1
Sumando y simplificando, el polinomio quedaría como: 7n-2
70000
60000
50000
40000
30000
20000
10000
0
0 2000 4000 6000 8000 10000 12000
200000000
150000000
100000000
50000000
0
0 2000 4000 6000 8000 10000 12000
-50000000
La ejecución de los casos aleatorios queda de la siguiente manera:
Con gráfica:
100000000
80000000
60000000
40000000
20000000
0
0 2000 4000 6000 8000 10000 12000
-20000000
Comparando resultados…
Insertion Sort
250000000
200000000
150000000
100000000
50000000
0
0 2000 4000 6000 8000 10000 12000
-50000000
b. Selection sort.
Para la realización de las pruebas de la complejidad de este algoritmo, se colocó un contador
en cada operación del algoritmo, incluyendo las comparaciones, las inserciones, los
intercambios, los incrementos y las asignaciones de variables auxiliares. Es decir, a cada
sentencia se le dio un contador.
Antes de la realización de las pruebas, se realizó de manera manual el análisis de
complejidad de este algoritmo obteniendo los polinomios del mejor de los casos y del peor
de los casos. Cabe mencionar que se colocó la función Sleep(1000) para que cambiará la
semilla de generación de los números aleatorios y así no tener los mismos valores.
Ya que se encuentran inmediatamente dentro del for principal, estas van a depender de la
comparación de la línea 2, lo cual significa que se ejecutarán una vez menos que la
comparación (n-1). Sin embargo, en la línea 4, esto solo aplica a la asignación inicial del for
secundario (j=i+1).
Líneas 4 a 6.
4. …+ n(n+1)/2 – 1 + n(n-1)/2
5. n(n-1)/2
6. 0
La línea 4 contiene una comparación que se ejecutará n(n+1)/2 veces, pero para demostrar
esto, veamos la siguiente tabla.
i j Ejecuciones
0 1, 2, 3, …, n n
1 2,3,4,…, n n-1
2 3,4,5,…, n n-2
…
n-3 n-3, n-2, n-1, n 4
n-2 n-2, n-1, n 3
n-1 n-1,n 2
Podemos notar diferencias con la tabla del anterior método de ordenamiento, sin embargo,
este también es una suma de los primeros n números menos 1, es decir, n(n+1)/2 -1.
Y de la misma manera que el anterior método de ordenamiento, lo que está dentro del for
secundario, se ejecutará una vez menos por iteración de este for. Es decir, n(n-1)/2 veces.
Para concluir el análisis del mejor de los casos de selection sort, podemos mencionar que
las líneas 6 y 8, no tienen ejecución, por lo que, quedaría así el análisis.
1.3
2.1 + n + n-1
3.n-1
4.n-1+ n(n+1)/2 – 1 + n(n-1)/2
5. n(n-1)/2
6.0
7.n-1
8.0
9….
Desarrollando y simplificando, el polinomio queda de la siguiente manera:
3/2n^2+9/2n-1
Con gráfica:
140000000
120000000
100000000
80000000
60000000
40000000
20000000
0
0 2000 4000 6000 8000 10000 12000
-20000000
Con gráfica:
140000000
120000000
100000000
80000000
60000000
40000000
20000000
0
0 2000 4000 6000 8000 10000 12000
-20000000
Comparando resultados…
Selection Sort
200000001 Casos aleatorios Peor de los casos Mejor
180000001
160000001
140000001
120000001
100000001
80000001
60000001
40000001
20000001
1
0 2000 4000 6000 8000 10000 12000
Notamos que no hay mucha diferencia entre el mejor de los casos y el promedio de ejecuciones
obtenido de las pruebas del programa.
c. Bubble sort.
Para la realización de las pruebas de la complejidad de este algoritmo, se colocó un
contador en cada operación del algoritmo, incluyendo las comparaciones, las
inserciones, los intercambios, los incrementos y las asignaciones de variables auxiliares.
Es decir, a cada sentencia se le dio un contador.
Antes de la realización de las pruebas, se realizó de manera manual el análisis de
complejidad de este algoritmo obteniendo los polinomios del mejor de los casos y del
peor de los casos. Cabe mencionar que se colocó la función Sleep(1000) para que
cambiará la semilla de generación de los números aleatorios y así no tener los mismos
valores.
Para la obtención del polinomio del mejor de los
casos:
1. 3
2. 1
3. 2
4. 1 + 1
Se espera que haya 7 instrucciones que se van a
ejecutar una sola vez en todo el programa (cuatro
declaraciones y tres asignaciones). Sin embargo,
la línea 2 tiene una comparación, que, en el mejor de los casos solo se ejecutará una
vez.
Líneas 5 y 6.
5. 1 + n + n-1
6. n-1
7. …
La línea 5 cuenta con tres instrucciones, j=0, j<i y j++, que, en el mejor de los casos, j=0
se ejecutará solo una vez, mientras que la comparación se ejecutará n veces, ya que,
cuando i = n-1, j inicia desde 0 y recorrerá el ciclo for n veces, es decir, se ejecutará solo
una vez el ciclo for, cumpliendo n iteraciones. La instrucción del decremento, como
sabemos, se ejecutará una vez menos que la comparación, siendo que se ejecutará n-1
veces.
La línea 6 sigue la misma norma que el decremento, siendo que se ejecutará n-1 veces.
Líneas 7 y 8.
En el mejor de los casos no se ejecutarán dichas las líneas 7 y 8.
Líneas 10 y 11.
En el mejor de los casos se ejecutarán solo una vez cada línea.
Teniendo en cuenta esto, el análisis quedaría como:
1. 3
2. 1
3. 2
4. 1 +1
5. 1 + n + n-1
6. n-1
7. 0
8. 0
9. …
10. 1
11. 1
Sumando y simplificando las ejecuciones obtenidas, el polinomio del mejor de los casos
quedaría como:
3n+9
Con gráfica:
30000
25000
20000
15000
10000
5000
0
0 2000 4000 6000 8000 10000 12000
Para la obtención del peor de los casos:
1. 3
2. 1
3. 2
4. 1 + n
En el peor de los casos, sí se hará el ciclo for completo, por lo que, hará n iteraciones.
Para las líneas 5 a 6.
5. n-1 + n(n+1)/2-1+n (n-1)/2
6. n(n-1)/2
7. …
La línea 5 cuenta con tres instrucciones, una asignación, una comparación y un
decremento. La asignación se ejecutará n-1 veces, ya que se encuentre inmediatamente
después del for principal. La comparación en cambio, se ejecutará k veces por cada
iteración del for principal.
i j Ejecuciones
n-1 0, 1, 2,…n-3, n-2, n-1 n
n-2 0,1,2,…,n-3,n-2 n-1
n-3 0,1,2,…, n-3 n-2
…
2 0,1,2 3
1 0,1 2
Por lo que, la formula de la suma de los primeros n números serviría. Siendo que se
ejecutará n(n+1)/2-1
250000000
200000000
150000000
100000000
50000000
0
0 2000 4000 6000 8000 10000 12000
-50000000
La ejecución de los casos aleatorios:
La gráfica de los casos aleatorios sería:
200000000
150000000
100000000
50000000
0
0 2000 4000 6000 8000 10000 12000
-50000000
Comparando resultados…
Bubble Sort
Casos aleatorios Mejor de los casos Peor de los casos
300000000
250000000
200000000
150000000
100000000
50000000
0
0 2000 4000 6000 8000 10000 12000
-50000000