Descargar

Algoritmos de ordenamiento

Enviado por Autor


Partes: 1, 2

    edu.red Estructura de datos III Algoritmos de ordenamiento_byPerses.doc Página 5 de 33 Introducción. Uno de los problemas fundamentales en la ciencia de la computación es ordenar una lista de items. Existen una infinidad de métodos de ordenamiento, algunos son simples e intuitivos, como el bubble sort, y otros como son extremadamente complicados, pero producen los resultados mucho más rápido. En este trabajo se presentan los algoritmos de ordenamiento más comunes, entre los cuales están los siguientes: Bubble sort, Heap sort, Insertion sort, Merge sort, Quick sort, Selection sort y Shell sort. Los algoritmos de ordenamiento pueden ser divididos en dos clases de acuerdo a la complejidad de los mismos. La complejidad del algoritmo se denota según la notación Big-O. Por ejemplo, O(n) significa que el algoritmo tiene una complejidad lineal. En otras palabras, toma 10 veces más tiempo en operar un set de 100 datos que en hacerlo con un set de 10 items. Si la complejidad fuera O(n2) entonces tomaría 100 veces más tiempo en operar 100 items que en hacerlo con 10. Adicionalmente a la compejidad de los algoritmos, la velocidad de ejecución puede cambiar de acuerdo al tipo de dato a ordenar, es por ello que es conveniente comprar los algoritmos contra datos empíricos. Éstos datos empíricos se deben elaborar tomando la media de tiempo de ejecución en un conjunto de corridas y con datos del mismo tipo. En este trabajo se ejecutaron 10 veces cada algoritmo de ordenamiento con un set de 10000 datos de tipo entero de c++. Se realiza también una comprativa con otros tipos de datos como ser el long y el char para todos los algoritmos y luego se los compara entre cada uno de ellos. En el gráfico siguiente se puede ver el tiempo de ejecución del algoritmo en función de la cantidad de elementos, se puede observar que si los elementos a ordenar son pocos, menos de 1000 casi todos los tienen el mismo tiempo de respuesta, pero si la cantidad de datos aumenta los tiempos de respuesta van cambiando drásticamente entre cada uno de los ellos, y para una cantidad de datos de 8000 ya se puede determinar que el peor algoritmo es el bubble sort, mientras que el mejor es el Heap sort. edu.red Tiempo Tiempo Comparativa de algoritmos 400 350 300 250 200 150 100 50 0 -50 0 2000 4000 6000 8000 10000 Poly. ( Bubble) Poly. ( Insertion) Poly. ( Selection) Poly. ( Quick) Poly. ( Shell) Poly. ( Heap) Poly. ( Merge) Elementos Análisis de los algoritmos Bubble sort Este es el método más simple y antiguo para ordenar un conjunto de datos, es también el más lento. El algoritmo bubble sort tiene dos bucles for internos que recorren el vector comparando el elemento j-esimo-1 con el elemento con el j-esimo elemento y en caso de que este sea mayor hace un cambio de los elementos. Al tener dos bucles internos el comportamiento es en general O(n2), y en las mejores condiciones se comporta como O(n). Bubble sort 400 350 300 250 200 150 100 50 0 0 2000 4000 6000 8000 10000 Elementos Estructura de datos III Algoritmos de ordenamiento_byPerses.doc Página 6 de 33 edu.red Estructura de datos III Algoritmos de ordenamiento_byPerses.doc Página 7 de 33 Como funciona Consiste en comparar pares de elementos adyacentes e intercambiarlos entre sí hasta que estén todos ordenados. Con el array anterior, {40,21,4,9,10,35}: Primera pasada: {21,40,4,9,10,35} {21,4,40,9,10,35} {21,4,9,40,10,35} {21,4,9,10,40,35} {21,4,9,10,35,40} <– <– <– <– <– Se Se Se Se Se cambia cambia cambia cambia cambia el el el el el 21 por el 40. 40 por el 4. 9 por el 40. 40 por el 10. 35 por el 40. Segunda pasada: {4,21,9,10,35,40} <– Se cambia el 21 por el 4. {4,9,21,10,35,40} <– Se cambia el 9 por el 21. {4,9,10,21,35,40} <– Se cambia el 21 por el 10. Ya están ordenados, pero para comprobarlo habría que acabar esta segunda comprobación y hacer una tercera. Código fuente void bubbleSort (int numbers[], int array_size) { int i, j, temp; for (i = (array_size – 1); i >= 0; i–){ for (j = 1; j <= i; j++){ if (numbers[j-1] > numbers[j]){ temp = numbers[j-1]; numbers[j-1] = numbers[j]; numbers[j] = temp; } } } } Selection sort Este algoritmo trabaja seleccionando el item más pequeño a ser ordenado que aún esta en la lista, y luego haciendo un intercambio con el elemento en la siguiente posición. La complejidad de este algoritmo es O(n2). edu.red Tiempo Selection sort 180 160 140 120 100 80 60 40 20 0 0 2000 4000 6000 8000 10000 Elementos Como funciona. Este método consiste en buscar el elemento más pequeño del array y ponerlo en primera posición; luego, entre los restantes, se busca el elemento más pequeño y se coloca en segudo lugar, y así sucesivamente hasta colocar el último elemento. Por ejemplo, si tenemos el array {40,21,4,9,10,35}, los pasos a seguir son: {4,21,40,9,10,35} <– Se coloca el 4, el más pequeño, en primera posición : se cambia el 4 por el 40. {4,9,40,21,10,35} <– Se coloca el 9, en segunda posición: se cambia el 9 por el 21. {4,9,10,21,40,35} <– Se coloca el 10, en tercera posición: se cambia el 10 por el 40. {4,9,10,21,40,35} <– Se coloca el 21, en tercera posición: ya está colocado. {4,9,10,21,35,40} <– Se coloca el 35, en tercera posición: se cambia el 35 por el 40. Código fuente. void selectionSort(int numbers[], int array_size) { int i, j; int min, temp; for (i =

    Partes: 1, 2
    Página siguiente