Está en la página 1de 20

Método Burbuja Este método consiste y permite ordenar de menor a mayor (o de menor a mayor) una serie de números cualquiera

. El método va comparando pares de números. Ejemplo: arreglo original 8 6 paso 1 6 6 4 paso 2 4 4 4 paso 3 4 4 6 8 4 4 6 6 6 6 6 6 4 4 8 8 8 8 8 8 8 8 26 26 26 26 26 26 26 26 26 26 acción compara el 8 con 6 y los intercambia compara el 8 con 4 y los intercambia compara el 8 con 26 y no los intercambia compara el 4 con 6 y los intercambia compara el 6 con 8 y no los intercambia compara el 8 con 26 y no los intercambia compara el 4 con 6 y no los intercambia compara el 6 con 8 y no los intercambia compara el 8 con 26 y no los intercambia

Pseudo código del método burbuja 1.- inicio 2.- reservar espacio en la memoria 3.- Leer secuencia 4.- para (i=1,...,N-1) hacer 5.6.7.para (j=1,...,N-1) hacer comparar X[i] con X[i+1] y ordenar fin para

8.- fin para 9.- imprimir secuencia de números ordenados 10.- fin 2º refinamiento 1.- inicio 2.- reservar espacio en la memoria 3.- Leer secuencia 4.- para (i=1,...,N-1) hacer 5.6.7.8.9.fin si fin para para (j=1,...,N-1) hacer si X[i] > X[i+1] entonces permutar X[i] con X[i+1]

10.- fin para 11.- imprimir secuencia de números ordenados 12.- fin 3er refinamiento 1.- inicio 2.- reservar espacio en la memoria 3.- Leer secuencia 4.- para (i=1,...,N-1) hacer 5.6.7.8.9.para (j=1,...,N-1) hacer si X[i] > X[i+1] entonces AUX=X[i]; X[i]=X[i+1]; X[i+1]=AUX;

.- fin si fin para 12.10. para ordenar 1000 números: Nº de operaciones menor igual que 4 x 9992 = 3992004 Si utilizamos el mismo PC: . ==> 1 operación = 1/(4 x 108) segundos Por lo tanto. para ejcutar las 324 operaciones necesitamos: 324/(4 x 108) segundos = 8.imprimir secuencia de números ordenados 14.fin para 13. para ordenar 10 números: Nº de operaciones menor igual que 4 x 92 = 324 Si poseemos un PC que trabaje a 400MHz..11. pero es muy lento. Mejor Burbuja O (n) Medio O (n2) Peor O (n2) *O (n) *O (n 2 ) orden lineal orden cuadrático indica: lo normal indica: tratable Nº de operaciones menor o igual a (N-1)(N-1)(1+3) (el 3 es por las 3 asignaciones para permutar) O sea Nº de operaciones menor o igual a 4(N-1)2 Por ejemplo.fin El método burbuja es simple de implementar.1 x 10-7 segundos Otro ejemplo. por lo cual es sólo adecuado para pequeños conjuntos de números..

El método va comparando pares de números. tiene un buen desempeño. debido a que su complejidad es mínima y por lo tanto su tiempo de ejecución también es mínimo. Algoritmo quick sort El algoritmo quick sort es quizá el más eficiente de los algoritmos de ordenamiento. Todos los elementos en la otra sublista deben ser mayores que el pivote. La idea central de este algoritmo es la siguiente: Todos los elementos de una sublista deben ser menores que un elemento llamado pivote. Esto permite aplicar recursivamente el mismo procedimiento en ambas partes del conjunto hasta que éste quede completamente ordenado.3992004/(4 x 108) segundos = 9. .en una posiciónn tal que todos los que estén antes sean menores o iguales y todos los que estén después sean mayores. El método tiene una complejidad que va de lo normal a lo tratable. Si se toma un conjunto de elementos desordenados y se ubica uno cualquiera de ellos llamado pivote. entonces esa posición particular sería la correcta para ese elemento si el conjunto estuviera ordenado. pero todas ellas deben informar de algún modo en qué posición ha quedado ubicado el pivote. La tarea de dividir el conjunto de datos en dos grupos en torno al pivote es accesoria y puede ser realizada por una función auxiliar. Esta función auxiliar se puede implementar de varias maneras. Asimismo se verifica que el conjunto ha quedado dividido en dos partes: en la primera están todos los elementos menores o iguales al pivote y en la segunda todos los mayores. es decir.98 x 10-3 segundos Este método consiste y permite ordenar de menor a mayor (o de menor a mayor) una serie de números cualquiera.

debido a que su complejidad es mínima y por lo tanto su tiempo de ejecución también es mínimo. que se presenta a continuación. Todos los elementos en la otra sublista deben ser mayores que el pivote. . Método de ordenación por inserción binaria ORDENAMIENTO POR INSERCION BINARIA.ANÁLISIS DE COMPLEJIDAD PARA QUICK SORT Mejor Quick sort O (n log n) Medio O (n log n) Peor O (n2) *O (n log n) orden n logarítmico *O (n 2 ) orden cuadrático indica: esta bien indica: tratable El algoritmo quicksort es quizá el más eficiente de los algoritmos de ordenamiento. La idea central de este algoritmo es la siguiente: Todos los elementos de una sublista deben ser menores que un elemento llamado pivote. Algoritmo Par e Impar Lo siento pero: De este algoritmo lo único que he podido conseguir es el programa hecho en pascal.

} A[izq]=auz. El resto del procedimiento es similar al de inserción directa. } } j=i-1. } si no { izq=m+1. el método de ordenamiento por inserción binaria es una mejora del ordenamiento por inserción directa. si (aux<A[m]) { der=m-1.Veamos el algoritmo: Algoritmo del método INSERCIONBINARIA (A. mientras (izq<=der) { m=[parte entera ((izq+der)/2)]. j=j-11. Para lograr esta mejora se recurre a una búsqueda binaria en lugar de una búsqueda secuencial para insertar un elemento en la parte izquierda del arreglo. es decir. se repite este mismo procedimiento desde el segundo término hasta el último elemento. der=i-1. mientras (j>=izq) { A[j+1]=A[j].Como se dijo. izq=1. N) { para (i=2 hasta N) { aux = A[i]. } . que ya se encuentra ordenado.

es decir. la media proporciona el número de comparaciones: [(k-1) + 1]/2 = k/2 Se recomienda utilizar secuencias de incrementos. Para lograr esta mejora se recurre a una búsqueda binaria en lugar de una búsqueda secuencial para insertar un elemento en la parte izquierda del arreglo. que no tengan divisores comunes entre ellos distintos del 1. Método SHELL El método Shell (en honor a su descubridor D.ANÁLISIS DE COMPLEJIDAD PARA INSERCIÓN BINARIA Mejor Inserción binaria O (n) Medio O (n) Peor O (n2) *O (n) *O (n 2 ) orden lineal orden cuadrático indica: lo normal indica: tratable El método de ordenamiento por inserción binaria es una mejora del ordenamiento por inserción directa. por consiguiente. Shell) mejora del método de inserción simple ordenando subarrreglos del arreglo original en forma separada. que ya se encuentra ordenado. Ejemplo: . se toman elementos saltados del arreglo original en relación a incrementos predeterminados.L. Para crear estos nuevos subarreglos. donde ellos sean números primos relativos. Acerca de su complejidad El número de comparaciones en el i-ésimo paso es como máximo k-1 y como mínimo 1.

Suponiendo un arreglo X.. Con un salto igual a 3 se obtendrían: Subarreglo 1: X[0] X[3] X[6] .. se generarían los siguientes subarreglos: Subarreglo 1: X[0] X[5] X[10] ..3. Subarreglo 2: X[1] X[6] X[11] . Y así sucesivamente para diferentes valores de incremento o salto...1). x[5]) (x[1]. Subarreglo 4: X[3] X[8] X[13] .. Subarreglo 4: X[3] X[6] X[9] .. Supongamos que tenemos el siguienmte arreglo: 25 57 48 37 12 92 86 33 y que se elige la secuencia de incrementos (5.... y ordenar mediante inserción los subarreglos obtenidos. los archivos a ordenar para esta secuencia serían: con incremento = 5: (x[0]. Luego se toma otro valor de incremento. Lo habitual es tomar un valor de incremento. Subarreglo 3: X[2] X[7] X[12] ... x[7]) .. etc. etc. Subarreglo 2: X[1] X[4] X[7] ... y tomando un incremento (salto) igual a 5.. Subarreglo 3: X[2] X[5] X[8] . x[6]) (x[2]. y se ordenan ahora los asubarreglos generados a partir de este incremento.

x[6]. x[7]) A continuación se muestra el resultado del ordenamiento Shell sobre este arreglo. x[3]. x[3]. x[4]. x[6]) (x[1]. Las líneas indican los subarreglos que se procesan por separado.(x[3]) (x[4]) con incremento = 3: (x[0]. x[4]. x[7]) (x[2]. x[5]) con incremento = 1: (x[0]. x[1]. x[5]. Arreglo original paso 1 salto = 5 o 25 57 48 37 12 92 86 33 o 25 57 48 37 12 92 86 33 paso 2 salto = 3 25 57 33 37 12 92 86 48 paso 3 salto = 1 25 12 33 37 48 92 86 57 . x[2].

/* incre contiene la secuencia de incrementos. a continuación se muestra un ejemplo del método Shell en el siguiente fragmento de código en C: .j++) { K=X[j]. y numinc es el número total de incrementos */ int salto. .numi++) { salto = incre[numi]. .j<n.Arreglo ordenado 25 12 33 37 48 57 86 92 Habitualmente lo que se hace es generar un arreglo que contenga los incrementos. . /* salto es el incremento actual */ for (j=salto. numi.numi<numinc. for (numi=0. /* será el número de elementos del arreglo */ int i. for(i=j-salto. int X[n]. X[i]=K.j. .i-=salto) { X[i+salto]=X[i]. .i>=0&&K<X[i]. .K /* K será el elemento que se inserte para mantener el orden */ int incre[numinc]. Suponiendo que se tiene un arreglo con los incrementos.

. Eliminar la raíz del montículo en forma repetida. es decir. METODO HEAP SORT El método de ordenamiento heap sort es también conocido con el nombre de montículo y es el método más eficiente de ordenamiento de los que trabajan con árboles. sea mayor o igual que el valor de cualquiera de sus hijos". Para crear estos nuevos subarreglos. 2. que no tengan divisores comunes entre ellos distintos del 1.} } } . Conclusiones El método Shell (en honor a su descubridor D. Se recomienda utilizar secuencias de incrementos. Shell) mejora del método de inserción simple ordenando subarrreglos del arreglo original en forma separada. .L. METODO HEAPSORT La idea central de este algoritmo consiste en: 1. se toman elementos saltados del arreglo original en relación a incrementos predeterminados. Construir un montículo. . donde ellos sean números primos relativos. Montículo: "Para todo árbol se debe cumplir que su valor.

Bueno. Las comparaciones que se realizan serían las siguientes: A[1]<A[3] (10<60) entonces hay intercambio (se compara con A[3] por que este es el mayor de los hijos de A[1]. lo importante aquí es que seamos breves. ahora para representar un montículo en un arreglo lineal debe tenerse en cuenta lo siguiente para todo nodo 'K': 1. entonces procedemos a intercambiar la raíz con el elemento que ocupa la última posición. El nod o 'K' se almacena en la posición 'K' correspondiente. 2. El hijo derecho del nodo 'K' se almacena en la posición '2K+1'. Supongamos el siguiente arreglo: 67 56 60 44 21 28 36 15 35 16 13 08 27 12 07 10 llamaremos a la raiz al primer término. El hijo izquierdo del nodo 'K' se almacena en la posición '2K'. A[3]<A[7] (10<36) entonces si hay intercambio (A[7] es el mayor de los hijos de A[3] . asi que veamos con un ejemplo como se ordena. 3. Pero bueno.

A[7]<A[14] (10<12) entonces hay intercambio (A[14]es el mayor de los hijos de A[7]) Luego de eliminar la primera raíz. Luego de eliminar la segunda raíz. el arreglo quedó ordenado. . al eliminarse repetidamente la raíz del montículo. Pues bueno. entonces hay intercambio. Ahora el montículo irá desde A[1] hasta A[15] (desde el 60 hasta el 07) y se procede a realizar el procedimiento anterior: A[1]<A[2] A[2]<A[4] A[4]<A[9] (07<56) (07<44) (07<35) entonces hay intercambio. entonces hay intercambio. En este caso ya estará ordenado y terminaría el ciclo. Veamos que es lo que hace el algoritmo: ELIMINACION 3 4 5 6 7 8 9 10 11 12 13 14 15 44 36 35 28 27 21 16 15 13 12 10 08 07 35 35 21 21 21 16 15 12 12 10 08 07 08 MONTICULO 36 28 28 27 13 13 13 13 08 08 07 10 10 15 15 15 15 15 15 10 10 10 07 12 12 12 21 21 16 16 16 07 07 07 07 13 13 13 13 28 27 27 27 08 08 08 08 15 15 15 15 15 12 12 12 12 12 12 12 16 16 16 16 16 16 10 07 16 13 08 27 56 60 67 10 07 16 13 08 44 56 60 67 10 07 08 13 36 44 56 60 67 10 07 08 35 36 44 56 60 67 10 07 28 35 36 44 56 60 67 10 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 21 27 28 35 36 44 56 60 67 Si observas. el montículo quedaría de la siguiente forma: 56 44 36 35 21 28 12 15 07 16 113 08 27 10 60 67 Observese que nuevamente el término más grande quedó ubicado en la parte final del montículo. se realiza este mismo procedimiento hasta que el montículo quede de un solo término. esta es la forma de ordenarlo. el montículo queda ordenado de la siguiente forma: 60 56 36 44 21 28 12 15 35 16 13 08 27 10 07 67 Observa que el elemento más grande fué situado en la última posición del arreglo.

N) { int I. Necesitamos para realizar n adiciones y eliminaciones. AUX. K=parte entera(K/2). se procede a la eliminación de la raíz en forma repetida. } } } } /* una vez creado el montículo. función insertamonticulo(A. A es un arreglo de N elementos. dejar un algoritmo de complejidad O(n log n).ANÁLISIS DE COMPLEJIDAD PARA HEAPSORT La adición y eliminación consta de O(logn) operaciones. AP. BAND es una variable de tipo booleano} { para i=2 hasta N { k=I y BAND=verdadero. A[parte entera(K/2)]=A[K]. K. BAND=verdadero. IZQ. A[K]=AUX. ALGORITMO. si (A[K]>A[parte entera(K/2)]) { AUX=A[parte entera(K/2)].N) {I. mientras (K>1) y (BAND=verdadero) { BAND=falso. DER. . */ funcion eliminamonticulo (A.K y AUX son variables de tipo entero. Primero debemos construir el montículo insertándole los elementos. Este montículo lo representaremos como arreglo.

DER=3. DER=IZQ+1. este método consta de dos partes fundamentales: 1. AP=IZQ. Necesitamos para realizar n adiciones y eliminaciones. } } En general. . Eliminar repetidamente la raíz del montículo.para (I=N hasta 2 I--) { AUX=A[I]. AP=DER. } K=AP. IZQ=2. A[I]=A[1]. dejar un algoritmo de complejidad O(n log n). IZQ=K*2. si ((MAYOR<A[DER]) y (DER=!1)) { MAYOR=A[DER]. mientras (IZQ<I) { MAYOR=A[IZQ]. K=1. Conclusiones: La adición y eliminación consta de O(logn) operaciones. 2. } si (AUX<MAYOR) { A[K]=A[AP]. } A[K]=AUX. Construir el montículo.

20. 14. 24. 33. 93] Después del 4to. 46. 20.46] [04. Se mezclan y forman varias sublistas de dos elementos que continúan el proceso hasta formar la lista completa ya ordenada. paso [13. 24. Método Merge Sort Ordenación por mezcla de listas Este esquema considera el proceso de combinar dos sublistas ordenadas en una tercer lista que conserva el orden. 24. 46. 46. 46. 48 lista original dividida en sublistas atómicas [33][13] [46][62] [35][24] [14][68] [20][46] [93][04] [48] Después del 1er. 13. 33. 62] [14.68] [20.93] [48] Después del 2do.El método de ordenamiento heapsort es también conocido con el nombre de montículo y es el método más eficiente de ordenamiento de los que trabajan con árboles. 20. 46. 93. 93] [48] Después del 3er.35] [14. 13. 33. 48. 35. 14. 35. 68. paso [04. 35. paso [13. 24. Ejemplo: Ordenar la lista:33. 68.62] [24. 20. 14. 46. paso [13. 46. Inicialmente en la lista se consideran sublistas son atómicas (de un elemento) y por tanto están ordenadas. 35. 46. 62. 62. 68] [04. 48.33] [46. 62. 93] ANÁLISIS DE COMPLEJIDAD PARA MERGE SORT . 04. 68] [04.

comenzando con el dígito menos significativo y terminando con el dígito más significativo. después comenzando con la cola de los números con dígitos 0 y terminando con los de dígito 9 se regresan al arreglo original. mezcla de las dos originales. Las secuencias originales deben estar ordenadas. Cuando se efectúa este proceso para cada dígito al arreglo está ordenado. lo que también significa el número de iteraciones estimadas para el método. Tiene una complejidad de O(n log n) . lo que también significa el número de iteraciones estimadas para el método. Se toma cada número en el orden original y se coloca en una de las 10 colas dependiendo del valor del dígito que se esté procesando. Para cada dígito de las cifras a ordenar se efectúan los siguientes pasos. M es el número de dígitos que forman las cifras a ordenar. Tiene una complejidad de O(n log n) . n2). . CONDICIONES PARA APLICAR RADIX SORT Se debe cumplir que los números se encuentren dentro del rango (0 . El método Merge Sort combina un par de secuencias ordenadas en otra nueva secuncia ordenada. Método Base Radix (Radix Sort) Este algoritmo está basado en los valores reales de los dígitos de acuerdo a la posición que ocupan los números que son ordenados.Merge R=Q(m) Realiza una vuelta con una relación logRn / m = log * mn-1 pasos.

Luego se siguen efectuando nuevos barridos comprendidos entre las posiciones almacenadas en las variables. Ordenamiento Shaker Sort (Embudo o Sacudida) EL METODO DEL EMBUDO: En este algoritmo cada pasada tiene dos etapas. n2). entonces es necesario que el mayor de los números a ordenar sea como máximo 100. Este algoritmo está basado en los valores reales de los dígitos de acuerdo a la posición que ocupan los números que son ordenados. En la primera etapa (Que se efectua de derecha a izquierda) se trasladan los elementos más pequeños hacia la parte izquierda del arreglo. Para cada dígito de las cifras a ordenar se efectúan los siguientes pasos. comenzando con el dígito menos significativo y terminando con el dígito más significativo. El algoritmo termina cuando en una etapa no se producen intercambios o bien cuando el contenido de la variable que almacena el extremo izquierdo del arreglo es mayor que el contenido de la variable que almacena el extremo derecho.Esto quiere decir que si tenemos como n (el total de números a ordenar) igual a 10. almacenando en otra variable la posición del último elemento intercambiado. .N) { izq=2. Algoritmo Embudo (A. Se debe cumplir que los números se encuentren dentro del rango (0 . almacenando en una variable la posición del último elemento intercambiado. En la segunda pasada (Que se efectúa de izquierda a derecha) se trasladan los elementos más grandes hacia la parte derecha del arreglo.

k=1. } hasta que (izq>der) } El método shaker sort. Este algoritmo combina las dos formas más conocidas del método burbuja. Repita { para (i = der hasta izq) { si (A[i-1]>A[i]) { aux=A[i-1]. A[i-1]=A[i]. Método de la burbuja El siguiente pseudocódigo describe el método de ordenación conocido como la burbuja: . A[i-1]=A[i]. para (i = izq hasta der) { si (A[i-1]>A[i]) { aux=A[i-1]. } } der=k-1. A[i]=aux. A[i]=aux. conocido también como 'método del embudo o de la sacudida' es una optimización del método burbuja. } } izq=k+1.der=N. k=N. k=1.

w: item. if (i <= j) then begin w = a[i]. end. de: indice). que aplica que los intercambios sobre distancias largas son los más efectivos. begin for i = 2 to n do begin for j = n downto i do if (a[j-1]. if iz < j then quicksort(iz. j). if i < de then quicksort(i. a[j] = x.clave < a[j]. de). while (x. var i. x = a[(iz + de) div 2]. a[i] = a[j]. Los algoritmos de ordenación descritos se han tomado del libro ``Algoritmos + Estructuras de Datos = Programas" de Niklaus Wirth.clave > a[j]. j = de. var i. repeat while (a[i].clave) do j = j . end end end El método quicksort El quicksort es un método de ordenación basado en intercambios. i = i + 1. . a[j] = w.clave < x.clave) then begin x = a[j-1]. a[j-1] = a[j].1. x: item. begin i = iz.1. x.procedure burbuja. end until i > j. j = j . j : indice.clave) do i = i + 1. El pseudocódigo del algoritmo es el siguiente: procedure quicksort(iz. j : indice.