finish up the informe

This commit is contained in:
Chris Cromer 2018-11-22 20:02:30 -03:00
parent c5feaef796
commit f03fe103c8
Signed by: cromer
GPG Key ID: 39CC813FF3C8708A
9 changed files with 246 additions and 259 deletions

View File

@ -67,10 +67,12 @@ Xavier Canales
\pagenumbering{arabic} \pagenumbering{arabic}
\section{Pseudo código} \section{Pseudo código}
\subsection{Merge Sort} \subsection{Merge Sort}
\lstinputlisting{pseudo/mergesort.txt}
\newpage \newpage
\subsection{Quick Sort} \subsection{Quick Sort}
\lstinputlisting{pseudo/quicksort.txt} \lstinputlisting{pseudo/quicksort.txt}
\newpage \newpage
\subsection{Bubble Sort} \subsection{Bubble Sort}
\lstinputlisting{pseudo/bubblesort.txt} \lstinputlisting{pseudo/bubblesort.txt}
@ -78,73 +80,82 @@ Xavier Canales
\newpage \newpage
\subsection{Bitonic Sort} \subsection{Bitonic Sort}
\lstinputlisting{pseudo/bitonicsort.txt} \lstinputlisting{pseudo/bitonicsort.txt}
\newpage
\subsection{Ordenamiento por conteo}
\newpage \newpage
\subsection{Ordenamiento por selección} \subsection{Counting Sort}
\lstinputlisting{pseudo/countingsort.txt}
\newpage
\subsection{Selection Sort}
\lstinputlisting{pseudo/selectionsort.txt} \lstinputlisting{pseudo/selectionsort.txt}
\newpage \newpage
\section{Resultados} \section{Resultados}
\subsection{Análisis temporal} \subsection{Análisis temporal}
\subsubsection{Merge Sort} \subsubsection{Merge Sort}
Caso Promedio: $ \Theta (n log n)) $ \\ \underline{Caso Promedio:} $ \Theta(n log n)) $ \\
en.wikipedia.org/wiki/Merge\_sort\#Analysis El caso promedio de merge sort es lo mismo que su peor caso. \\
Peor Caso: $ O(n log n) $ \\ \underline{Peor Caso:} $ O(n log n) $ \\
En el peor de los casos, el merge sort hace aproximadamente un 39\% menos de comparaciones que el quick sort en su caso promedio. En términos de movimientos, la complejidad del peor de los casos de merge sort es $ O(n log n) $ la misma complejidad que el mejor de Quick sort, y el mejor de la clasificación de merge sort toma aproximadamente la mitad de las iteraciones que en el peor de los casos. \\
\underline{Mejor Caso:} $ \Omega(n log n)$ \\
Mejor Caso: $ \Omega (n log n)$ \\ En el caso mejor de merge sort, el merge sort funciona mejor cuando los datos son secuencial. \\
\subsubsection{Quick Sort} \subsubsection{Quick Sort}
Caso Promedio: $ \Theta (n(log n)) $ \\ \underline{Caso Promedio:} $ \Theta(n(log n)) $ \\
El tiempo de ejecución que tendrá el algoritmo dependerá de como se realice la partición de el arreglo entrada, es decir, depende de la selección del pivote El tiempo de ejecución que tendrá el algoritmo dependerá de como se realice la partición de el arreglo entrada, es decir, depende de la selección del pivote. \\
Peor Caso: $ O(n^2) $ \\ \underline{Peor Caso:} $ O(n^2) $ \\
El peor de los casos para el quicksort resultará cuando la elección del pivote sea el valor más pequeño del arreglo o el más grande de este mismo. El peor de los casos para el quick sort resultará cuando la elección del pivote sea el valor más pequeño del arreglo o el más grande de este mismo. \\
\underline{Mejor Caso:} $ \Omega(n log(n)) $ \\
Para obtener el mejor caso posible será cuando el pivote se encuentre exactamente al medio del arreglo, porque lo dividirá en dos obteniendo n/2 elementos en ambas divisiones del arreglo. \\
Mejor Caso: $ \Omega $(n log(n)) \\
Para obtener el mejor caso posible será cuando el pivote se encuentre exactamente al medio del arreglo, porque lo dividirá en dos obteniendo n/2 elementos en ambas divisiones del arreglo
\subsubsection{Bubble Sort} \subsubsection{Bubble Sort}
Caso Promedio: $ \Theta (n^2)) $ \\ \underline{Caso Promedio:} $ \Theta(n^2)) $ \\
El caso promedio compara la complejidad temporal con el peor caso, donde n es el numero de valores a ordenar, esto es producto de la forma en la cual Bubble transporta los valores dentro de su ordenamiento El caso promedio compara la complejidad temporal con el peor caso, donde n es el numero de valores a ordenar, esto es producto de la forma en la cual \textit{bubble} transporta los valores dentro de su ordenamiento. \\
Peor Caso: $ O(n^2) $ \\ \underline{Peor Caso:} $ O(n^2) $ \\
En el peor caso el arreglo a ordenar va a estar ordenado en forma descendente previamente. \\
\underline{Mejor Caso:} $ \Omega(n)$ \\
Mejor Caso: $ \Omega (n)$ \\ El mejor caso para el bubble sort será cuando el arreglo de entrada venga previamente ordenado de menor a mayor. \\
El mejor caso para el Bubble sort será cuando el arreglo de entrada venga previamente ordenado de menor a mayor.
\subsubsection{Bitonic Sort} \subsubsection{Bitonic Sort}
Caso Promedio: $\Theta(log^2(n))$ \\ \underline{Caso Promedio:} $\Theta(log^2(n))$ \\
El ordenamiento bitonico responde igual a todos los casos porque siempre antes de empezar a ordenarlos realiza las mismas comparaciones para dejarlos en la secuencia bitonica El ordenamiento bitonico responde igual a todos los casos porque siempre antes de empezar a ordenarlos realiza las mismas comparaciones para dejarlos en la secuencia bitonica. \\
Peor Caso: $O(log^2(n))$ \\ \underline{Peor Caso:} $ O(log^2(n)) $ \\
Su caso peor es lo mismo que su caso promedio. \\
Mejor Caso: $\Omega(log^2(n))$ \\ \underline{Mejor Caso:} $ \Omega(log^2(n)) $ \\
Su caso mejor es lo mismo que su caso promedio. \\
\subsubsection{Ordenamiento por conteo} \subsubsection{Counting Sort}
Caso Promedio: $ \Theta (n + k)) $ \\ \underline{Caso Promedio:} $ \Theta(\frac{n^2}{2}) $ \\
La complejidad total es igual para todos los casos, porque el algoritmo usa sólo ciclos simples, sin recursividad o sub-funciones, va directamente al analisis La complejidad total es igual para todos los casos, porque el algoritmo usa sólo ciclos simples, sin recursividad o sub-funciones, va directamente al análisis. \\
Peor Caso: $ O(n + k) $ \\ \underline{Peor Caso:} $ O(\frac{n^2}{2}) $ \\
Su caso pero es lo mismo que su caso promedio. \\
\underline{Mejor Caso:} $ \Omega(\frac{n^2}{2}) $ \\
Su caso mejor es lo mismo que su caso promedio. \\
Mejor Caso: $ \Omega (n + k)$ \\ \subsubsection{Selection Sort}
\underline{Caso Promedio:} $ \Theta(n^2) $ \\
El ordenamiento por selección no es un algoritmo de ordenamiento adaptable, realiza el mismo numero de comparaciones de elementos en el mejor caso, el caso promedio y el peor de los casos, esto se debe a que no utiliza el orden existente de las entradas del arreglo para ordenar. \\
\subsubsection{Ordenamiento por selección} \underline{Peor Caso:} $ O(n^2) $ \\
Caso Promedio: $\Theta(n^2)$ \\ Su caso peor es lo mismo que su caso promedio. \\
El ordenamiento por selección no es un algoritmo de ordenamiento adaptable, realiza el mismo numero de comparaciones de elementos en el mejor caso, el caso promedio y el peor de los casos, esto se debe a que no utiliza el orden existente de las entradas de el arreglo para ordenar.
Peor Caso: $O(n^2)$ \\
Mejor Caso: $\Omega(n^2)$
\underline{Mejor Caso:} $ \Omega(n^2) $ \\
Su caso mejor es lo mismo que su caso promedio. \\
\newpage \newpage
\subsection{Datos} \subsection{Datos}
La siguiente tabla contiene los resultados de las pruebas de los 6 algoritmos medidos en segundos. Para las pruebas usábamos un computador que tiene un procesador AMD A12 con 4 núcleos de 2.7Ghz y 16GB de memoria RAM. La siguiente tabla contiene los resultados de las pruebas de los 6 algoritmos medidos en segundos. Para las pruebas usábamos un computador que tiene 4 nucleos de 3.2GHz y 16GB de memoria RAM.
\begin{center} \begin{center}
\begin{tabular}{|c|c|c|c|c|c|c|} \begin{tabular}{|c|c|c|c|c|c|c|}
\hline \hline
@ -156,11 +167,11 @@ La siguiente tabla contiene los resultados de las pruebas de los 6 algoritmos me
\hline \hline
\rule[-1ex]{0pt}{3.5ex} 100.000 & 0.170[s] & 0.300[s] & 0.124[s] & 11.645[s] & 30.269[s] & 32.347[s] \\ \rule[-1ex]{0pt}{3.5ex} 100.000 & 0.170[s] & 0.300[s] & 0.124[s] & 11.645[s] & 30.269[s] & 32.347[s] \\
\hline \hline
\rule[-1ex]{0pt}{3.5ex} 1.000.000 & 0.173[s] & 0.304[s] & 1.405[s] & 1,262.000[s] & 3,026.900[s] & 3,234.700[s] \\ \rule[-1ex]{0pt}{3.5ex} 1.000.000 & 0.173[s] & 0.304[s] & 1.405[s] & 3,144.000[s] & 6,717.674[s] & 7,248.000[s] \\
\hline \hline
\rule[-1ex]{0pt}{3.5ex} 5.000.000 & 2.000[s] & 1.577[s] & 7.421[s] & 31,550.000[s] & 75,672.500[s] & 80,867.500[s] \\ \rule[-1ex]{0pt}{3.5ex} 5.000.000 & 2.000[s] & 1.577[s] & 7.421[s] & 60,951.000[s] & 139,273.286[s] & 153,273.539[s] \\
\hline \hline
\rule[-1ex]{0pt}{3.5ex} 10.000.000 & 2.400[s] & 3.236[s] & 18.365[s] & 126,200.000[s] & 302,690.000[s] & 323,470.000[s] \\ \rule[-1ex]{0pt}{3.5ex} 10.000.000 & 2.400[s] & 3.236[s] & 18.365[s] & 243,804.000[s] & 557,093.1440[s] & 613,094.156[s] \\
\hline \hline
\end{tabular} \end{tabular}
\end{center} \end{center}
@ -174,6 +185,18 @@ La siguiente tabla contiene los resultados de las pruebas de los 6 algoritmos me
\newpage \newpage
\section{Conclusiones} \section{Conclusiones}
Basados en los resultados obtenido podemos poner los algoritmos en orden de mas rápido a menos rápido en la siguiente forma:
\begin{itemize}
\setlength\itemsep{0.1em}
\item Quick Sort
\item Merge Sort
\item Bitonic Sort
\item Selection Sort
\item Counting Sort
\item Bubble Sort
\end{itemize}
Al final resulta que el mas rápido algoritmo de ordenamiento que probamos fue Quick Sort mientras que el mas lento fue el Bubble Sort.
Los resultados de tiempo de ejecución estaban de lo que esperábamos dado el complejidad de los algoritmos.
\end{document} \end{document}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -1,126 +1,81 @@
entrada: array: arreglo de n datos: n: tamaño del arreglo entrada: array: arreglo de n datos; n: tamaño del arreglo
salida: arreglo ordenado salida: arreglo ordenado
funcion potencia_de_dos(inicio n) funcion ordenamientobitonico(array, n)
orden(array, n, 1)
si(n = 0) entonces return array
retornar 0
fin si
mientras(n distinto 1) hacer
si (n % 2 distinto 0) hacer
retornar 0
fin si
fin mientras
retornar 1
fin funcion fin funcion
inicio funcion mejor_potencia_de_2_menos_a_n(inicio n) funcion potencia_de_dos(n)
si n = 0 entonces
inicio k = 1 retornar 0
fin si
mientras(k > 0 y k < n) hacer mientras n distinto 1 hacer
si n es modulo de 2 entonces
retornar 0
fin si
fin mientras
retornar 1
fin funcion
funcion mejor_potencia_de_2_menos_a_n(n)
k = 1
mientras k > 0 y k < n hacer
busca el numero potencia de dos mas proximo hacia abajo en n busca el numero potencia de dos mas proximo hacia abajo en n
fin mientras
fin mientras retorna k
retorna k
fin funcion fin funcion
funcion comparar(inicio i, inicio j, inicio dir, inicio arreglo) funcion comparar(i, j, dir, array)
temp = array[i]
temp = array[i]; array[i] = array[j]
array[i] = array[j]; array[j] = temp
array[j] = temp;
fin funcion fin funcion
funcion unionbitonica(inicio low, inicio n, inicio dir, inicio arreglo) funcion unionbitonica(low, n, dir, array)
si n > 1 entonces
inicio i k = n / 2
inicio k para i = low hasta i < low + k con paso i = i + 1
comparar(i + k, di, array)
si(n > 1) entonces fin para
unionbitonica(low, k, dir, array)
k = n/2 unionbitonica(low + k, k, dir, array)
fin si
para i = low hasta i < low + k con paso i = i+1
comparar(, i + k, di, arreglo)
fin para
unionbitonica(low, k, dir, arreglo)
unionbitonica(low + k, k, dir, arreglo)
fin si
fin funcion fin funcion
funcion unionbitonico2(inicio low, inicio n, inicio dir, inicio arreglo) funcion unionbitonico2(low, n, dir, array)
si n > 1 entonces
inicio i k = mejor_potencia_de_2_menos_a_n
inicio k para i = low hasta i < low + n - k con paso i = i + 1 hacer
comparar(i, i + k, dir, array)
si(n > 1) entonces fin para
ordenamientobitonico2(low, k, dir, array)
k = mejor_potencia_de_2_menos_a_n ordenamientobitonico2(low + k, n - k, dir, array)
para i = low hasta i < low + n - k con paso i = i + 1 hacer
comparar(i, i + k, dir, arreglo)
fin para
ordenamientobitonico2(low, k, dir, arreglo)
ordenamientobitonico2(low + k, n - k, dir, arreglo)
fin funcion fin funcion
funcion recorrerbitonico(int low, int n, int dir, int arreglo) funcion recorrerbitonico(low, n, dir, array)
si n > 1 entonces
inicio k k = n / 2
si(n > 1) entonces recorrerbitonico(low, k, 1, array)
recorrerbitonico(low + k, k, 0, array)
k = n / 2 unionbitonica(low, n, dir, array)
recorrerbitonico(low, k, 1, arreglo) fin si
recorrerbitonico(low + k, k, 0, arreglo)
unionbitonica(low, n, dir, array)
fin si
fin funcion fin funcion
funcion recorrerbitonico2(int low, int n, int dir, int arreglo) funcion recorrerbitonico2(low, n, dir, array)
si n > 1 entonces
inicio k k = n / 2
recorrerbitonico2(low, k, !di, array)
si(n > 1) entonces recorrerbitonico2(low + k, n - k, dir, array)
k = n / 2 unionbitonico2(low, n, dir, array)
recorrerbitonico2(low, k, !di, arreglo) fin si
recorrerbitonico2(low + k, n - k, dir, arreglo)
unionbitonico2(low, n, dir, arreglo)
fin si
fin funcion fin funcion
funcion orden(int arreglo, int n, int dir) funcion orden(array, n, dir)
si potencia_de_dos(n) entonces
si(potencia_de_dos(n)) entonces recorrerbitonico(0, n, dir, array)
fin si
recorrerbitonico(0,n,dir,arreglo) sino
recorrerbitonico2(0, n, dir, array)
fin si fin sino
sino
recorrerbitonico2(0, n, dir, arreglo)
fin sino
fin funcion fin funcion
funcion ordenamientobitonico(inicio arreglo, inicio n)
orden(arreglo, n, 1)
fin funcion

View File

@ -1,13 +1,19 @@
entrada: array: arreglo de elementos enteros; n: tamaño del arreglo entrada: array: arreglo de elementos enteros; n: tamaño del arreglo
salida: arreglo array ordenado ascendentemente. salida: arreglo array ordenado ascendentemente
cuentaDeElementos := n funcion bubblesort(array, n)
repetir flag = 1
haCambiado := falso mientras que flag es verdad
disminuir cuentaDeElementos flag = false
repetir con indice desde 1 a cuentaDeElementos para i = 1 mientras que i < j con pasa i = i + 1 hacer
if (array en indice) > (array en (indice + 1)) si array[i] < array[i - 1] entonces
intercambiar (array en indice) con (array en (indice + 1)) temp = array[i]
haCambiado := falso array[i] = array[i - 1]
hasta haCambiado = verdad array[i - 1] = temp
retorna array flag = verdad
fin si
fin para
j = j - 1;
fin mientras
retorna array
fin funcion

View File

@ -0,0 +1,22 @@
entrada: array: arreglo de elementos enteros; n: tamaño del arreglo
salida: arreglo array ordenado ascendentemente
funcion countingsort(array, n)
para i = 0 mientras que i < n con paso i = i + 1 hacer
count[i] = 0
fin para
para i = 0 mientras que i < n - 1 con paso i = i + 1 hacer
para j = i + 1 mientras que j < n con paso j = j + 1 hacer
si array[i] < array[j] entonces
count[j] = count[j] + 1
sino
count[i] = count[i] + 1
fin si
fin para
fin para
para i = 0 mientras que i < n con paso i = i + 1 hacer
newarray[count[i]] = array[i]
}
retorna newarray
fin funcion

43
doc/pseudo/mergesort.txt Normal file
View File

@ -0,0 +1,43 @@
entrada: array: arreglo de n datos; n: tamaño del arreglo
salida: arreglo ordenado
funcion mergesort(array, n)
correr_mergesort(array, 0, n - 1);
retorna array
fin funcion
funcion correr_mergesort(array, izquerda, derecha)
si izquerda != derecha entonces
medio = (izquerda + derecha) / 2
correr_mergesort(array, izquerda, medio)
correr_mergesort(array, medio + 1, derecha)
unir(array, izquerda, medio + 1, derecha)
fin si
fin funcion
funcion unir(array, previo_izquerda, previo_medio, derecha)
i = 0
izquerda = previo_izquerda
medio = previo_medio - 1
far_derecha = derecha - izquerda + 1
mientras que previo_izquerda <= medio y previo_medio <= derecha hacer
si array[previo_izquerda] < array[previo_medio] entonces
temp[i++] = array[previo_izquerda++]
sino
temp[i++] = array[previo_medio++]
fin si
fin mientras
mientras que previo_izquerda <= medio hacer
temp[i++] = array[previo_izquerda++]
fin mientras
mientras que previo_medio <= derecha hacer
temp[i++] = array[previo_medio++]
fin mientras
para i = 0 mientras que i < far_derecha con paso i = i + 1 hacer
array[izquerda + i] = temp[i]
fin para
fin funcion

View File

@ -1,40 +1,33 @@
entrada: array: arreglo de n datos: n: tamaño del arreglo entrada: array: arreglo de n datos; n: tamaño del array
salida: arreglo ordenado salida: arreglo ordenado
funcion quick_sort{ funcion quick_sort(array, n)
si n < 2 entonces
si(n < 2) entonces{ retorna
retorna fin si
}
inicio i pivote = array[n / 2]
inicio j
inicio temp
inicio pivote
pivote = arreglo[n / 2] para i = 0 y j = n - 1 con paso i = i + 1 y j = j - 1 hacer
mientras que array[i] < pivote hacer
i = i + 1
fin mientras
para i = 0 y j = n-1 con paso i = i + 1 y j = j - 1 hacer mientras que array[j] > pivote hacer
mientras(arreglo[i] < pivote) hacer j = j - 1
i = i + 1 fin mientras
fin mientras
mientras(arreglo[j] > pivote) hacer si i >= j entonces
j = j - 1 break
fin mientras fin si
si(i >= j) entonces temp = array[i]
break array[i] = array[j]
fin si array[j] = temp
fin para
temp = arreglo[i] quick_sort(array, i)
arreglo[i] = arreglo[j] quick_sort(array + i, n - i)
arreglo[j] = temp
fin para
quick_sort(arreglo, i)
quick_sort(arreglo + i, n - i)
retorna el arreglo ordenado
fin funcion retorna array
fin funcion

View File

@ -1,31 +1,17 @@
entrada: array: arreglo de n datos: n: tamaño del arreglo entrada: array: arreglo de n datos; n: tamaño del arreglo
salida: arreglo ordenado salida: arreglo ordenado
funcion selection_sort funcion selection_sort(array, n)
para i = 0 hasta i < n - 1 con paso i = i + 1 hacer
inicio i min_idx = i
inicio j para j = i + 1 hasta j < n con paso j = j + 1 hacer
inicio temp si array[j] < array[min_idx] entonces
inicio min_idx min_idx = j
fin si
para i = 0 hasta i < n - 1 con paso i = i + 1 hacer fin para
temp = array[min_idx]
min_idx = i array[min_idx] = array[i]
array[i] = temp
para j = i + 1 hasta j < n con paso j = j + 1 hacer fin para
retorna array
si (arreglo[j] < arreglo[min_idx] hacer) hacer fin funcion
min_idx = j
fin si
fin para
temp = arreglo[min_idx]
arreglo[min_idx] = arreglo[i]
arreglo[i] = temp
fin para
fin funcion

View File

@ -1,41 +0,0 @@
Quick sort
10.000 - 0.1 segundos
100.000 - 0.17 segundos
1.000.000 - 0.173 segundos
5.000.000 - 2.0 segundos
10.000.000 - 2.4 segundos
Merge sort
10.000 - 0.28 segundos
100.000 - 0.30 segundos
1.000.000 - 0.304 segundos
5.000.000 - 1.577 segundos
10.000.000 - 3.236 segundos
Bitonic sort
10.000 - 0.09 segundos
100.000 - 0.124 segundos
1.000.000 - 1.405 segundos
5.000.000 - 7.421 segundos
10.000.000 - 18.365 segundos
Selection sort
10.000 - 0.143 segundos
100.000 - 11.645 segundos
1.000.000 - 21 minutos y 2.0 segundos 1262 segundos
5.000.000 - 8 horas, 45 minutos y 50 segundos teo 31550 segundos
10.000.000 - 1 day, 11 horas, 3 minutos y 20 segundos teo 126200 segundos
Count sort
10.000 - 0.258 segundos
100.000 - 30.269 segundos
1.000.000 - 50 minutos y 26.9 segundos teo 3026.9 segundos
5.000.000 - 21 horas, 1 minuto y 12.5 segundos teo 75672.5 segundos
10.000.000 - 3 dias, 12 horas, 4 minutos y 50 segundos teo 302690 segundos
Bubble sort
10.000 - 0.326 segundos
100.000 - 32.347 segundos
1.000.000 - 53 minutos y 54.7 segundos teo 3234.7 segundos
5.000.000 - 22 horas, 27 minutos y 47.5 segundos teo 80867.5 segundos
10.000.000 - 3 dias, 17 horas, 51 minutos y 10 segundos teo 323470 segundos