You are on page 1of 28

ALGORITMOS COMPUTACIONALES

Equipo 5

En ocasiones es necesario llevar a cabo listas y bases de datos que faciliten el manejo de grandes cantidades de datos e información con el fin de clasificarlos y ordenarlos para poder encontrar lo que se busca de una forma rápida y eficiente.

Desde que la tecnología existe, lo mencionado anteriormente, se ha podido facilitar a gran escala a través de programas y aplicaciones diseñados específicamente para llevar a cabo estas funciones.

dependiendo de la necesidad. y es lo veremos a continuación. Los métodos de organización pueden ser listas. . Existen muchos tipos de algoritmos que nos pueden ser útiles para hacer este tipo de tareas. los cuales se definen como un algoritmo que sirve para organizar una cantidad determinada de datos en un orden específico. vectores o matrices.En esta ocasión hablaremos acerca de algunos algoritmos de ordenamiento (recursivo).

.Este método consiste en acomodar el vector (lista) moviendo el mayor hasta la última casilla comenzando desde la casilla cero del vector hasta haber acomodado el número más grande el la última posición.

éste vuelve a comparar las ya ordenadas.Una vez acomodado el más grande. prosigue a encontrar y acomodar el siguiente más grande comparando de nuevo los números desde el inicio del vector. . Este algoritmo es muy deficiente ya que al ir comparando las casillas para buscar el siguiente más grande. y así sigue hasta ordenar todo los elementos el arreglo. A pesar de ser el algoritmo de ordenamiento más deficiente que hay. éste es el más usado en todos los lenguajes de programación.

y el primero es casi tan eficiente como el segundo. Luego el segundo mas pequeño. .El método de ordenamiento por selección consiste en encontrar el menor de todos los elementos del arreglo e intercambiarlo con el que está en la primera posición. y así sucesivamente hasta ordenar todo el arreglo. pero la forma de ordenamiento es diferente. El método de selección es similar al de burbuja.

. Si resulta que el elemento con el que se está comparando es mayor que el elemento a ordenar. se detiene el proceso de comparación pues se encontró que el elemento ya está ordenado y se coloca en su posición (que es la siguiente a la del último número con el que se comparó).Este método toma cada elemento del arreglo para ser ordenado y lo compara con los que se encuentran en posiciones anteriores a la de él dentro del arreglo. se recorre hacia la siguiente posición superior. resulta que el elemento con el que se está comparando es menor que el elemento a ordenar. Si por el contrario.

En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la vez. Cada elemento es INSERTADO en la posición apropiada con respecto al resto de los elementos ya ordenados. N representa el número de elementos que contiene a[ ]. Este procedimiento recibe el arreglo de datos a ordenar a[ ] y altera las posiciones de sus elementos hasta dejarlos ordenados de menor a mayor. .

. paso 3: [Compara v con los anteriores] While a[j-1] > v AND j>1 do paso 4: [Recorre los datos mayores] Set a[j] ← a[j-1]. paso 5: [Inserta v en su posición] Set a[j] ← v. paso 5: [Decrementa j] set j ← j-1. paso 6: [Fin] End. del arreglo] For i ← 2 to N do paso 2: [Inicializa v y j] v ← a[i] j ← i.Ejemplo: paso 1: [Para cada pos.

. no sólo porque puede ser más rápido para cantidades pequeñas de elementos sino particularmente debido a su facilidad de programación. para listas relativamente pequeñas el orden por inserción es una buena elección. Sin embargo. es muy ineficiente al compararlo con otros algoritmos como quicksort.Aunque este algoritmo tiene un mejor orden de complejidad que el de burbuja.

   El consumo de recursos (memoria) es menor. Mayor eficiencia y velocidad de procesamiento. . Posibilidad de dividir el trabajo en varios procesadores.Consiste en dividir la lista original en dos listas más pequeñas.

recorriendo simultáneamente la lista en ambas direcciones e intercambiando entre sí cada par de elementos “descolocados” que se encuentran a su paso.Se elige un elemento cualquiera (aunque en general se suele utilizar el que se encuentra en medio de la lista) que nos servirá como pivote. el pivote. y otro grupo compuesto por números mayores a él. Las implementaciones más eficientes realizan esta tarea a la vez. y los mayores a la derecha. Luego se recorre toda la lista. Culminada esta etapa tenemos un grupo de elementos menores que el pivote. . con el objeto de colocar los elementos más pequeños que el pivote a la izquierda del mismo.

y una de más de un millón en solo 20. En cada nivel el tamaño de las sublistas la mitad del anterior. Lo mejor de todo es que el tamaño de las sublistas -y por ende el tiempo que se necesita para procesarlas.En este punto es donde juega un papel importante la recursividad: si cada uno de esos grupos vuelve a dividirse en dos y se aplica lo explicado anteriormente de forma recursiva. tenemos resuelto el problema.es cada vez menor. . lo que permite ordenar una lista de 1024 elementos en 10 “pasadas”.

.

ya ordenada. y otra casi del mismo tamaño que la original. desordenada) y el algoritmo no será tan eficiente. . Si somos tan burros como para elegir un elemento que se encuentre en uno de los extremos de la lista. habremos dividido el problema en dos partes muy dispares (una con solo un elemento.Este algoritmo es fuertemente dependiente de la “suerte” que hayamos tenido al elegir el elemento pivote.

y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos.Ordenamiento de disminución incremental. El valor K es llamado incremento. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor más pequeño de K. Después de que los primeros K subgrupos han sido ordenados (generalmente utilizando INSERCION DIRECTA).  Ordena subgrupos de elementos separados K unidades (respecto de su posición en el arreglo) del arreglo original. . se escoge un nuevo valor de K más pequeño.

Al principio del proceso se escoge la secuencia de decrecimiento de incrementos. el valor de K llega a ser 1. el último valor debe ser 1." . "Es como hacer un ordenamiento de burbuja pero comparando e intercambiando elementos. de tal manera que el subgrupo consiste de todo el arreglo ya casi ordenado.Eventualmente.

El método se basa en tomar como salto N/2 (siendo N el número de elementos) y luego se va reduciendo a la mitad en cada repetición hasta que el salto o distancia vale 1.Cuando el incremento toma un valor de 1. todos los elementos pasan a formar parte del subgrupo y se aplica inserción directa. .

El último paso del Shell sort es un simple ordenamiento por inserción. teniendo en cuenta dos observaciones: 1.El Shell sort es una generalización del ordenamiento por inserción. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. en general.El ordenamiento por inserción es ineficiente. Esto permite que un elemento haga "pasos más grandes" hacia su posición esperada. 2. El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones.. pero para entonces. ya está garantizado que los datos del vector están casi ordenados. porque mueve los valores sólo una posición cada vez. .El ordenamiento por inserción es eficiente si la entrada está "casi ordenada"..

. Un cambio menor presentado en el libro de V. Aunque es fácil desarrollar un sentido intuitivo de cómo funciona este algoritmo. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el óptimo O(n log n).El Shell sort se usa comúnmente en lenguajes de programación. Pratt produce una implementación con un rendimiento de O(nlog2 n) en el peor caso. La secuencia de incrementos usada en este ejemplo de código da un tiempo de ejecución O(n2) en el peor caso. esto es una implementación del algoritmo en C/C++ para ordenar un vector de enteros. es muy difícil analizar su tiempo de ejecución. requiere O(n2) comparaciones e intercambios en el peor caso. Su implementación original.

En 1969. Cabe recordar que cada vez que se propone una secuencia de intervalos es necesario "correr" el algoritmo para analizar el tiempo de ejecución del mismo. que no es más que el método de inserción directa estudiado previamente. Unas pruebas exhaustivas realizadas para obtener la mejor secuencia de intervalos cuando el número de elementos del arreglo es igual a 8 arrojaron como resultado que la mejor secuencia corresponde a un intervalo de 1. Pratt descubrió que el tiempo de ejecución del algoritmo del orden de n*(log n)2. Nadie ha sido capaz de establecer la mejor secuencia de incrementos cuando N es muy grande. .El análisis de eficiencia de este método en un problema muy complicado y aun no resuelto.

no requiere de masivos llamados recursivos para encontrar una solución. El ordenamiento por montículo es el más lento de los algoritmos de ordenamiento con complejidad O(n log2n) pero a diferencia de los ordenamientos de mezcla y rápido. .Un montículo es una estructura de datos tipo árbol binario. cuya principal característica es que el nodo padre es mayor que sus hijos. sin importar la relación que haya entre los hijos. lo que lo hace bastante atractivo para grandes conjuntos de datos.

. indicando que el arreglo está ordenado.El funcionamiento del ordenamiento por montículo se basa en la construcción de un montículo de datos. Después de remover cada elemento se debe reconstruir el montículo para que siga cumpliendo con sus propiedades. lo que tiene una complejidad de O(log2 n). el cual requiere de O(log2 n) operaciones para insertar un elemento y como son n elementos. entonces la complejidad de su construcción es O(n log2 n). y luego remueve cada uno de los elementos del montículo y lo ubica al final del arreglo. el proceso se realiza hasta que el montículo esté vacío.

.

y se ordenan mediante sucesivos llamados recursivos para luego fusionar los resultados en el arreglo inicial. . el cual tiene una complejidad de O(n) para mezclar dos arreglos.Este algoritmo divide el arreglo inicial en dos arreglos donde cada uno contiene la mitad de los datos (partes iguales mas o menos uno). Este algoritmo se basa en una función que permite mezclar dos vectores ordenados. produciendo como resultado un tercer vector ordenado que contiene los elementos de los dos vectores iniciales. donde n es la suma de los tamaños de los dos arreglos.

El algoritmo principal que divide el arreglo. . entonces la complejidad total del algoritmo será de O(n log2 n). realiza O(log2 n) particiones y como llama a la función que mezcla los dos arreglos y que tiene una complejidad de O(n).

la cual consideramos que es el método de ordenamiento rápido (Quicksort).Todos los algoritmos o métodos de ordenamiento que vimos anteriormente tienes sus ventajas y desventajas. Pero en el ámbito de la programación siempre se busca la mejor opción. como toda solución o programa que ha sido creado hasta hoy. debido a que tiene un método relativamente eficiente en la mayoría de los casos. .