Sei sulla pagina 1di 13

ESTRUCTURAS DE DATOS

UNIDAD 5: ALGORITMOS DE ORDENAMIENTO

ACTIVIDAD 1. REPORTE DE INVESTIGACIN SOBRE ALGORITMOS DE ORDENAMIENTO

POR:

VICTOR ALFONSO MONTALVO RODRIGUEZ KATHERIN VILLA MARVN OSCAR DE JESS BLANCO REYES

3 A ING. SISTEMAS COMPUTACIONALES

LI. HORACIO GARCIA ALDAPE

CD. VALLES, S.L.P A 03 DE NOVIEMBRE DE 2011

ALGORITMOS DE ORDENAMIENTO
En computacin y matemticas un algoritmo de ordenamiento recursivo es un algoritmo que pone elementos de una lista o un vector en una secuencia dada por una relacin de orden, es decir, el resultado de salida ha de ser una permutacin o reordenamiento de la entrada que satisfaga la relacin de orden dada. Las relaciones de orden ms usadas son el orden numrico y el orden lexicogrfico. Ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos (como los de bsqueda y fusin) que requieren listas ordenadas para una ejecucin rpida. Tambin es til para poner datos en forma cannica y para generar resultados legibles por humanos. Desde los comienzos de la computacin, el problema del ordenamiento ha atrado gran cantidad de investigacin, tal vez debido a la complejidad de resolverlo eficientemente a pesar de su planteamiento simple y familiar. Por ejemplo, BubbleSort fue analizado desde 1956.[1] Aunque muchos puedan considerarlo un problema resuelto, nuevos y tiles algoritmos de ordenamiento se siguen inventado hasta el da de hoy (por ejemplo, el ordenamiento de biblioteca se public por primera vez en el 2004). Los algoritmos de ordenamiento son comunes en las clases introductorias a la computacin, donde la abundancia de algoritmos para el problema proporciona una gentil introduccin a la variedad de conceptos ncleo de los algoritmos, como notacin de O mayscula, algoritmos divide y vencers, estructuras de datos, anlisis de los casos peor, mejor, y promedio, y lmites inferiores.

CLASIFICACIN
Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras:

La ms comn es clasificar segn el lugar donde se realice la ordenacin o Algoritmos de ordenamiento interno: en la memoria del ordenador. o Algoritmos de ordenamiento externo: en un lugar externo como un disco duro. Por el tiempo que tardan en realizar la ordenacin, dadas entradas ya ordenadas o inversamente ordenadas: o Algoritmos de ordenacin natural: Tarda lo mnimo posible cuando la entrada est ordenada. o Algoritmos de ordenacin no natural: Tarda lo mnimo posible cuando la entrada est inversamente ordenada. Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenan originalmente los elementos con claves iguales. Por ejemplo, si una

lista ordenada por fecha se reordena en orden alfabtico con un algoritmo estable, todos los elementos cuya clave alfabtica sea la misma quedarn en orden de fecha. Otro caso sera cuando no interesan las maysculas y minsculas, pero se quiere que si una clave aBC estaba antes que AbC, en el resultado ambas claves aparezcan juntas y en el orden original: aBC, AbC. Cuando los elementos son indistinguibles (porque cada elemento se ordena por la clave completa) la estabilidad no interesa. Los algoritmos de ordenamiento que no son estables se pueden implementar para que s lo sean. Una manera de hacer esto es modificar artificialmente la clave de ordenamiento de modo que la posicin original en la lista participe del ordenamiento en caso de coincidencia. Los algoritmos se distinguen por las siguientes caractersticas:

Complejidad computacional (peor caso, caso promedio y mejor caso) en trminos de n, el tamao de la lista o arreglo. Para esto se usa el concepto de orden de una funcin y se usa la notacin O(n). El mejor comportamiento para ordenar (si no se aprovecha la estructura de las claves) es O(n log n). Los algoritmos ms simples son cuadrticos, es decir O(n). Los algoritmos que aprovechan la estructura de las claves de ordenamiento (p. ej. bucket sort) pueden ordenar en O(kn) donde k es el tamao del espacio de claves. Como dicho tamao es conocido a priori, se puede decir que estos algoritmos tienen un desempeo lineal, es decir O(n). Uso de memoria y otros recursos computacionales. Tambin se usa la notacin O(n).

ESTABILIDAD
Los algoritmos de ordenamiento estable mantienen un relativo preorden total. Esto significa que un algoritmo es estable solo cuando hay dos registros R y S con la misma clave y con R apareciendo antes que S en la lista original. Cuando elementos iguales (indistinguibles entre s), como nmeros enteros, o ms generalmente, cualquier tipo de dato en donde el elemento entero es la clave, la estabilidad no es un problema. De todas formas, se asume que los siguientes pares de nmeros estn por ser ordenados por su primer componente:
(4, 1) (3, 7) (3, 1) (5, 6)

En este caso, dos resultados diferentes son posibles, uno de los cuales mantiene un orden relativo de registros con claves iguales, y una en la que no:

(3, 7) (3, 1) (4, 1) (5, 6) (orden mantenido) (3, 1) (3, 7) (4, 1) (5, 6) (orden cambiado)

Los algoritmos de ordenamiento inestable pueden cambiar el orden relativo de registros con claves iguales, pero los algoritmos estables nunca lo hacen. Los algoritmos inestables pueden ser implementados especialmente para ser estables. Una forma de hacerlo es extender artificialmente el cotejamiento de claves, para que las comparaciones entre dos objetos con claves iguales sean decididas usando el orden de las entradas original. Recordar este orden entre dos objetos con claves iguales es una solucin poco prctica, ya que generalmente acarrea tener almacenamiento adicional. Ordenar segn una clave primaria, secundaria, terciara, etc., puede ser realizado utilizando cualquier mtodo de ordenamiento, tomando todas las claves en consideracin (en otras palabras, usando una sola clave compuesta). Si un mtodo de ordenamiento es estable, es posible ordenar mltiples tems, cada vez con una clave distinta. En este caso, las claves necesitan estar aplicadas en orden de aumentar la prioridad. Ejemplo: ordenar pares de nmeros, usando ambos valores
(4, 1) (3, 7) (3, 1) (4, 6) (original) (4, 1) (3, 1) (4, 6) (3, 7) (despus de ser ordenado por el segundo valor) (3, 1) (3, 7) (4, 1) (4, 6) (despus de ser ordenado por el primer valor)

Por otro lado:


(3, 7) (3, 1) (4, 1) (4, 6) (despus de ser ordenado por el primer valor) (3, 1) (4, 1) (4, 6) (3, 7) (despus de ser ordenando por el segundo valor, el orden por el primer valor es perturbado)

LISTA DE ALGORITMOS DE ORDENAMIENTO


Algunos algoritmos de ordenamiento agrupados segn estabilidad tomando en cuenta la complejidad computacional.
Estables Complejidad O(n) O(n) O(n) O(n) O(n+k) O(n log n)

Nombre traducido Ordenamiento de burbuja Ordenamiento de burbuja bidireccional Ordenamiento por insercin Ordenamiento por casilleros Ordenamiento por cuentas Ordenamiento por mezcla

Nombre original Bubblesort Cocktail sort

Memoria O(1) O(1) O(1) O(n) O(n+k) O(n)

Mtodo Intercambio Intercambio Insercin No comparativo No comparativo Mezcla

Insertion sort Bucket sort Counting sort Merge sort

Ordenamiento con rbol binario

Ordenamiento Radix

Nombre traducido Ordenamiento Shell Ordenamiento por seleccin Ordenamiento por montculos Ordenamiento rpido

O(n log n) Binary tree sort O(n+k) Pigeonhole sort O(nk) Radix sort O(n) versin Distribution sort recursiva O(n) Gnome sort Inestables Nombre Complejidad original 1.25 O(n ) Shell sort O(n log n) Comb sort O(n) Selection sort O(n log n) Heapsort O(n log n) Promedio: O(n log n), peor caso: O(n) Promedio: O(n Several Unique Sort u), peor caso: O(n); u=n; u = nmero nico de registro Cuestionables, imprcticos Nombre Complejidad original O(n n!), peor: Bogosort no termina O(n), excepto Pancake sorting en mquinas de Von Neumann Randomsort Smoothsort Quicksort

O(n) O(k) O(n) O(n)

Insercin

No comparativo

Memoria O(1) O(1) O(1) O(1) O(1) O(log n)

Mtodo Insercin Intercambio Seleccin Seleccin Seleccin Particin

Nombre traducido

Memoria

Mtodo

METODOS ITERATIVOS
Estos mtodos son simples de entender y de programar ya que son iterativos, simples ciclos y sentencias que hacen que el vector pueda ser ordenado. Dentro de los Algoritmos iterativos encontramos: Burbuja Insercin Seleccin Shellsort

METODOS RECURSIVOS
Estos mtodos son aun ms complejos, requieren de mayor atencin y conocimiento para ser entendidos. Son rpidos y efectivos, utilizan generalmente la tcnica Divide y vencers, que consiste en dividir un problema grande en varios pequeos para que sea ms fcil resolverlos. Mediante llamadas recursivas a s mismas, es posible que el tiempo de ejecucin y de ordenacin sea ms ptimo. Dentro de los algoritmos recursivos encontramos: Ordenamiento por Mezclas (merge) Ordenamiento Rpido (quick)

METODO DE LA BURBUJA
El mtodo de la burbuja es uno de los ms simples, es tan fcil como comparar todos los elementos de una lista contra todos, si se cumple que uno es mayor o menor a otro, entonces los intercambia de posicin. Por ejemplo, imaginemos que tenemos los siguientes valores: 5 6 1 0 3

Lo que hara una burbuja simple, seria comenzar recorriendo los valores de izq. A derecha, comenzando por el 5. Lo compara con el 6, con el 1, con el 0 y con el 3, si es mayor o menor (dependiendo si el orden es ascendiente o descendiente) se intercambian de posicin. Luego continua con el siguiente, con el 6, y lo compara con todos los elementos de la lista, esperando ver si se cumple o no la misma condicin que con el primer elemento. As, sucesivamente, hasta el ltimo elemento de la lista.

BURBUJA SIMPLE
Como lo describimos en el item anterior, la burbuja ms simple de todas es la que compara todos con todos, generando comparaciones extras, por ejemplo, no tiene sentido que se compare con sigo mismo o que se compare con los valores anteriores a l, ya que supuestamente, ya estn ordenados.

for (i=1; i<LIMITE; i++) for j=0 ; j<LIMITE - 1; j++) if (vector[j] > vector[j+1]) temp = vector[j]; vector[j] = vector[j+1]; vector[j+1] = temp;

BURBUJA MEJORADA
Una nueva versin del mtodo de la burbuja seria limitando el nmero de comparaciones, dijimos que era intil que se compare consigo misma. Si tenemos una lista de 10.000 elementos, entonces son 10.000 comparaciones que estn sobrando. Imaginemos si tenemos 1.000.000 de elementos. El mtodo seria mucho mas optimo con n comparaciones menos (n = total de elementos).

BURBUJA OPTIMIZADA
Si al cambio anterior (el de la burbuja mejorada) le sumamos otro cambio, el hecho que los elementos que estn detrs del que se est comparando, ya estn ordenados, las comparaciones serian aun menos y el mtodo seria aun ms efectivo. Si tenemos una lista de 10 elementos y estamos analizando el quinto elemento, qu sentido tiene que el quinto se compare con el primero, el segundo o el tercero, si supuestamente, ya estn ordenados. Entonces optimizamos ms aun el algoritmo, quedando nuestra versin final del algoritmo optimizado de la siguiente manera: Bubblesort(int matriz[]) { int buffer; int i,j; for(i = 0; i < matriz.length; i++) { for(j = 0; j < i; j++) { if(matriz[i] < matriz[j]) { buffer = matriz[j]; matriz[j] = matriz[i]; matriz[i] = buffer; }

} } }

INSERCION Y SELECCION
Insercion(int matrix[]) { int i, temp, j; for (i = 1; i < matrix.length; i++) { temp = matrix[i]; j = i - 1; while ( (matrix[j] > temp) && (j >= 0) ) { matrix[j + 1] = matrix[j]; j--; } matrix[j + 1] = temp; } } Seleccion(int[]matrix) { int i, j, k, p, buffer, limit = matrix.length-1; for(k = 0; k < limit; k++) { p = k; for(i = k+1; i <= limit; i++) if(matrix[i] < matrix[p]) p = i; if(p != k) { buffer = matrix[p]; matrix[p] = matrix[k]; matrix[k] = buffer; } } } El bucle principal de la ordenacin por insercin va examinando sucesivamente todos los elementos de la matriz desde el segundo hasta el n-ensimo, e inserta cada uno en el lugar adecuado entre sus predecesores dentro de la matriz. La ordenacin por seleccin funciona seleccionando el menor elemento de la matriz y llevndolo al principio; a continuacin selecciona el siguiente menor y lo pone en la segunda posicin de la matriz m y as sucesivamente.

ORDENAMIENTO POR MEZCLA


Este algoritmo consiste bsicamente en dividir en partes iguales la lista de nmeros y luego mezclarlos comparndolos, dejndolos ordenados. Si se piensa en este algoritmo recursivamente, podemos imaginar que dividir la lista hasta tener un elemento en cada lista, luego lo compara con el que est a su lado y segn corresponda, lo sita donde corresponde. En la siguiente figura podemos ver cmo funciona:

El algoritmo de ordenamiento por mezcla (Mergesort) se divide en dos procesos, primero se divide en partes iguales la lista: public static void mergesort(int[ ] matrix, int init, int n) { int n1; int n2; if (n > 1) { n1 = n / 2; n2 = n - n1; mergesort(matrix, init, n1); mergesort(matrix, init + n1, n2); merge(matrix, init, n1, n2); }

} Y el algoritmo que nos permite mezclar los elementos segun corresponda: private static void merge(int[ ] matrix, int init, int n1, int n2) { int[ ] buffer = new int[n1+n2]; int temp = 0; int temp1 = 0; int temp2 = 0; int i; while ((temp1 < n1) && (temp2 < n2)) { if (matrix[init + temp1] < matrix[init + n1 + temp2]) buffer[temp++] = matrix[init + (temp1++)]; else buffer[temp++] = matrix[init + n1 + (temp2++)]; } while (temp1 < n1) buffer[temp++] = matrix[init + (temp1++)]; while (temp2 < n2) buffer[temp++] = matrix[init + n1 + (temp2++)]; for (i = 0; i < n1+n2; i++) matrix[init + i] = buffer[i]; }

METODO SHELLSORT
Este mtodo es una mejora del algoritmo de ordenamiento por Insercin (Insertsort). Si tenemos en cuenta que el ordenamiento por insercin es mucho ms eficiente si nuestra lista de nmeros esta semi-ordenada y que desplaza un valor una nica posicin a la vez. Durante la ejecucin de este algoritmo, los nmeros de la lista se van casiordenando y finalmente, el ltimo paso o funcin de este algoritmo es un simple mtodo por insercin que, al estar casi-ordenados los nmeros, es ms eficiente. El algoritmo: public void shellSort(int[] matrix) { for ( int increment = matrix.length / 2; increment > 0; increment = (increment == 2 ? 1 : (int) Math.round(increment / 2.2))) { for (int i = increment; i < matrix.length; i++) {

for (int j = i; j >= increment && matrix[j - increment] > matrix[j]; j -= increment) { int temp = matrix[j]; matrix[j] = matrix[j - increment]; matrix[j - increment] = temp; } } } }

METODO RAPIDO (quicksort)


Sin duda, este algoritmo es uno de los ms eficientes. Este mtodo es el mas rpido gracias a sus llamadas recursivas, basandose en la teora de divide y vencers. Lo que hace este algoritmo es dividir recursivamente el vector en partes iguales, indicando un elemento de inicio, fin y un pivote (o comodn) que nos permitir segmentar nuestra lista. Una vez dividida, lo que hace, es dejar todos los mayores que el pivote a su derecha y todos los menores a su izq. Al finalizar el algoritmo, nuestros elementos estn ordenados. Por ejemplo, si tenemos 3 5 4 8 bsicamente lo que hace el algoritmo es dividir la lista de 4 elementos en partes iguales, por un lado 3, por otro lado 4 8 y como comodn o pivote el 5. Luego pregunta, 3 es mayor o menor que el comodn? Es menor, entonces lo deja al lado izq. Y como se acabaron los elementos de ese lado, vamos al otro lado. 4 Es mayor o menor que el pivote Menor, entonces lo tira a su izq. Luego pregunta por el 8, al ser mayor lo deja donde esta, quedando algo as: 3 4 5 8 En esta figura se ilustra de mejor manera un vector con ms elementos, usando como pivote el primer elemento:

El algoritmo es el siguiente: public void _Quicksort(int matrix[], int a, int b) { this.matrix = new int[matrix.length]; int buf; int from = a; int to = b; int pivot = matrix[(from+to)/2]; do { while(matrix[from] < pivot) { from++; } while(matrix[to] > pivot) { to--; } if(from <= to) { buf = matrix[from]; matrix[from] = matrix[to]; matrix[to] = buf; from++; to--; } }while(from <= to); if(a < to) { _Quicksort(matrix, a, to); } if(from < b) { _Quicksort(matrix, from, b); } this.matrix = matrix; }

COMPLEJIDAD
Cada algoritmo de ordenamiento por definicin tiene operaciones y clculos mnimos y mximos que realiza (complejidad), a continuacin una tabla que indica la cantidad de clculos que corresponden a cada mtodo de ordenamiento: Algoritmo Burbuja Insercin Seleccin Shell Merge Quick Operaciones mximas (n2) (n2/4) (n2) (n log2n) (n logn) (n2) en peor de los casos y (n logn) en el promedio de los casos.

BIBLIOGRAFIA http://blog.zerial.org/ficheros/Informe_Ordenamiento.pdf http://es.wikipedia.org/wiki/Algoritmo_de_ordenamiento

Potrebbero piacerti anche