You are on page 1of 21

M etodos de Ordenaci on Notas de Clase

Prof. Juan Andr es Colmenares, M.Sc. Instituto de C alculo Aplicado Facultad de Ingenier a Universidad del Zulia 25 de marzo de 2004

Indice
1. M etodos de Ordenaci on Elementales 1.1. Terminolog a General . . . . . . . . . . . . . . . . . . . . . . 1.2. M etodo de Ordenaci on por Selecci on . . . . . . . . . . . . . . 1.3. M etodo de Ordenaci on por Inserci on . . . . . . . . . . . . . . 1.4. Caracter sticas de Rendimiento de los M etodos de Ordenaci on Elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. M etodo de Ordenaci on de Shell (Shell Sort ) 3. Ordenaci on por Fusi on 3.1. Descripci on . . . . . 3.2. Desempe no . . . . . 3.3. Caracter sticas . . . (MergeSort) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 4 5 6 8 9 9 10

4. QuickSort 10 4.1. Descripci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.1. Procedimiento de Partici on . . . . . . . . . . . . . . . 11 4.2. Desempe no . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5. Colas de Prioridad (Mot culos) 5.1. Cola de Prioridad como Tipo de Dato Abstracto 5.2. Alternativas de Implementaci on . . . . . . . . . . 5.3. Mont culo Binario (Binary Heap) . . . . . . . . . 5.3.1. Algoritmos sobre Mont culos . . . . . . . 1 16 16 17 17 18

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

6. Ordenaci on por Mont culo 19 6.1. Propiedad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 6.2. Propiedad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

1.

M etodos de Ordenaci on Elementales


Los m etodos de ordenaci on elementales proporcionan: una terminolog a b asica un mecanismo b asico que puede extenderse a otros m etodos m as generales, sosticados y con mejor desempe no.

T picamente, los m etodos de ordenaci on elementales tienen peor desempe no que los sosticados, pero existen muchas aplicaciones en las que es mejor utilizar un m etodo de ordenaci on elemental. Por ejemplo, cuando el algoritmo se utiliza pocas veces y/o se ordenan pocos elementos. Como regla general se tiene que los m etodos elementales necesitan cerca de N 2 pasos para ordenar N elementos organizados al azar. En general, no se recomienda su uso para ordenar: archivos grandes archivos clasicados aleatoriamente. Por su parte, m etodos mas avanzados pueden lograr desempe nos de orden 3 N logN , N 2 , N . Mas a un, se puede demostrar que ning un m etodo de ordenaci on puede utilizar menos de N logN comparaciones entre claves cuando estas est an organizadas al azar.

1.1.

Terminolog a General

En el contexto de los m etodos de ordenaci on, cada elemento de dato tiene su clave, y los m etodos de ordenaci on trabajan ordenando los elementos de dato seg un sus claves. Por lo regular, los m etodos comparan las claves e intercambian los elementos de dato. En lugar de desplazar f sicamente los elementos de datos, con frecuencia, s olo se intercambian ndices, punteros o referencias. Esto se denomina ordenaci on indirecta. Un m etodo de ordenaci on que trabaja sobre un conjunto de datos que se encuentra en memoria (e.g., un arreglo, una lista) se dice que es un m etodo de ordenaci on interna. Por el contrario, si el conjunto de datos almacenados en archivos no pueden ser cargado en memoria (por ejemplo, por 2

razones de tama no) y el m etodo de ordenaci on opera sobre los archivos, se dice que es de ordenaci on externa. Evidentemente, en la ordenaci on interna se accede a los elementos de dato m as f acilmente, mientras que en la ordenaci on externa se accede a los elementos de dato de forma secuencial o al menos en grades bloques. Los m etodos de ordenaci on se pueden clasicar de acuerdo a sus requerimientos de memoria. Los m etodos in situ son aquellos que requieren ninguna o muy poca memoria extra. En el otro extremo, existen m etodos que requieren mucha memoria extra. Una caracter stica que puede ser importante es la estabilidad del m etodo de ordenaci on. Un algoritmo de ordenaci on es estable si elementos de dato con la misma clave conservan su orden relativo luego de su aplicaci on. T picamente, los m etodos elementales son estables mientras que la mayor a de los algoritmos sosticados no lo son. Entre los m etodos de ordenaci on elementales est an Selecci on e Inserci on, los cuales son descritos a continuaci on.

1.2.

M etodo de Ordenaci on por Selecci on

Supongamos que tenemos un arreglo con los datos, entonces el procedimiento es como sigue: 1. 2. 3. 4. se sit ua en el primer elemento (i=0). se busca el elemento m as peque no de arreglo (desde i hasta el nal). se intercambia el elemento m as peque no con el que est a en la posici on i. se incrementa i (i++).

N otese que se gasta la mayor parte del tiempo en intentar en encontrar el elemento m nimo. A continuaci on se presenta una implementaci on en Java del m etodo de ordenaci on por selecci on: /** * Clase que implementa m etodos de ordenaci on elementales. */ public class Sorting { static public void selectionSort(Comparable array[]) 3

{ // No se incluye validaci on de par ametro de entrada. int min; for (int i = 0; i < array.length; i++) { min = i; for (int j = i + 1; j < array.length; j++) { if (array[j].compareTo(array[min]) < 0) { min = j; } } Sort.swap(array, min, i); } } private static void swap(Comparable[] array, int i, int j) { Comparable tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } El m etodo de ordenaci on por selecci on: 1. 2. 3. est a basado en el enfoque de fuerza bruta funciona bien con archivos peque nos cada elemento se mueve s olo una vez

1.3.

M etodo de Ordenaci on por Inserci on

Considere que los elementos est an uno tras otro, el m etodo consiste en insertar cada elemento en el lugar apropiado entre los elementos que ya han sido considerado (manteni endolos ordenados). Es similar a la forma en que se ordena un juego de cartas. Por ejemplo: 4

E E E E E E E

J J J E E E E

E M P L O A O R D E N A R E J J J J

M M P M P L L M P ...

A continuaci on se muestra una implementaci on en Java del m etodo de ordenaci on por inserci on. static public void insertionSort(Comparable array[]) { // No se incluye validaci on de par ametro de entrada. int min; for (int i = 1; i < array.length; i++) { Comparable tmp = array[i]; int j; for (j = i; j > 0 && tmp.compareTo(array[j-1]) < 0; j--) { array[j] = array[j-1]; } array[j] = tmp; } }

1.4.

Caracter sticas de Rendimiento de los M etodos de Ordenaci on Elementales


La simple inspecci on de las implementaciones anteriores sirve de evidencia de que los m etodos elementales son cuadr aticos (tanto en el peor caso como en el caso medio) y no necesitan memoria extra (in situ ). La ordenaci on por selecci on utiliza aproximadamente N 2 /2 comparaciones y N intercambios. El n umero de comparaciones est a dado por: N (N 1) (N 1) + (N 2) + (N 3) + + 2 + 1 = . 2 Si N entonces el n umero de comparaciones es igual a N 2 /2.

Por otra parte, puede haber m aximo N 1 intercambios. Estos resultados son independientes del conjuntos de datos de entrada, entonces se dice que el m etodo de selecci on es insensible a los datos de entrada. La ordenaci on por inserci on utiliza aproximadamente N 2 /4 compara2 ciones y N /8 intercambios en el caso medio y dos veces m as en el peor 2 2 caso(N /2 comparaciones y N /4 intercambios). N otese que cuando el archivo est a ordenado la ordenaci on por inserci on es lineal (O(N )). Muchas veces se abusa de los m etodos de ordenaci on de prop osito general, en especial en estos casos donde el m etodo de inserci on supera a los m etodos sosticados. Por ejemplo, supongamos que se desea a nadir algunos elementos a una lista ordenada para obtener una lista ordenada m as grande. Para ello: 1. 2. A nada los nuevos elementos al nal del archivo Llame al m etodo de ordenaci on por inserci on

Se puede demostrar que cualquier algoritmo de ordenaci on que intercambie elementos adyacentes tiene un tiempo de ejecuci on promedio 2 (N ) (cota inferior).

2.

M etodo de Ordenaci on de Shell (Shell Sort )

Fue uno de los primeros m etodos en romper la barrera del tiempo cuadr atico. Ya sabemos que cualquier algoritmo de ordenaci on que intercambie elemento adyacentes tendr a un tiempo promedio de ejecuci on de orden cuadr atico. Qu e podemos para tratar de mejorar eso? Simplemente hacer comparaciones e intercambios entre elementos no adyacentes (es decir, m as apartados). En consecuencia, Shell Sort compara elementos que est an distantes, y esta distancia disminuye en la medida que el algoritmo progresa hasta la u ltima fase en la cual se comparan elementos adyacentes. Shell Sort utiliza secuencias de incrementos del tipo: ht , ht1 , . . . , h2 , h1 donde h1 = 1 y hk < hk+1 . Despu es de una fase y habiendo usando un incremento hk , para cada elemento i se cumple que a[i] < a[i + hk ], es decir que todos los elementos espaciados hk est an ordenados. En este caso se dice que tenemos una archivo hk -ordenado. En cada fase se realizan ordenaciones por inserci on en arreglos independientes. A continuaci on se presenta un ejemplo de la ejecuci on de Shell Sort con la secuencia {5, 3, 1}:

Original 5-ordenado 3-ordenado 1-ordenado

81 35 28 11

94 17 12 12

11 11 11 15

96 28 35 17

12 12 15 28

35 41 41 35

17 75 58 41

95 15 17 58

28 96 94 75

58 58 75 81

41 81 81 94

75 96 96 95

15 95 95 96

Propiedad1 : un archivo hk -ordenado que es luego hk1 -ordenado, mantiene su condici on de hk -ordenado. N otese que el desempe no del algoritmo depende de la secuencia seleccionada y que unas secuencias son mejores que otras. Algunas de las secuencias m as utilizadas son las siguientes: hk = N/2 y hk = hk+1 /2 : es una secuencia que ofrece pobre desempe no (peor caso: (N 2 )). Incremento de Hibbard: 1, 3, 7, . . . , 2k 1 (peor caso: (N 2 ), caso 5 promedio: O(N 4 )). Incremento de Sedgewick: 1, 4, 13, 40, 121, 364, 1093, . . . (nunca hace 3 m as de (N 2 ) comparaciones). Una de las mejores secuencias es 1, 5, 19, 41, 109, . . . y est a dada por: i i i i (9 4 9 2 + 1) o (4 3 2 + 1). Se ha comprobado que la cota (N 2 ) aplica a muchas secuencias. A continuaci on se presenta una implementaci on en Java del m etodo de ordenaci on de Shell que utiliza la secuencia de Sedgewick. static public void shellSort(Comparable array[]) { // No se incluye validaci on de par ametro de entrada. Comparable tmp; int h = 0; // generate the sequence for (h = 0; h < array.length; h=3*h+1); for (; h>0; h/=3) {
1 Si no se cumpliera esta propiedad, el algoritmo fuera de poca utilidad pues una fase posterior da nar a lo que ha hecho una fase previa. 3 3

for (int i = h; i < array.length; i++) { tmp =array[i]; int j = i; while (j>=h && tmp.compareTo(array[j-h]) < 0) { array[j] = array[j-h]; j-=h; } array[j] = tmp; } } }

3.

Ordenaci on por Fusi on (MergeSort)

Es un algoritmo recursivo (de tipo divide y vencer as) cuyo tiempo de ejecuci on es de O(N lnN ) en el peor caso, y el n umero de comparaciones usadas es cercana al optimo. La operaci on fundamental sobre la cual se basa este algoritmo es: funsionar 2 arreglos (listas) ordenados(as) en un(a) arreglo (lista) mayor tambi en ordenado(a). Esta operaci on se puede realizar en un s olo paso por la entrada, si la salida es puesta en su tercer arreglo. Sup ongase que tenemos como entrada dos arreglos de elementos ya ordenados (A[N] y B[M]) y como salida el arreglo C[N+M]; adicionalmente tenemos las variables enteras (contadores) a, b y c inicializadas en 0 que servir an para manejar los ndices de los arreglos. Dado esto la operaci on se realiza de la siguiente manera: 1. 2. El menor de A[a] y B[b] es colocado en C[c] y se incrementan los contadores apropiados. Cuando se llega al nal de alguno de los arreglos de entrada el resto del otro arreglo es copiada a C.

La Figura 1 ejemplica la operaci on b asica de fusionar dos arreglos ordenados. Mezclar dos arreglos (listas) ordenados(as) en otro(a) ordenado(a) es un proceso lineal: cuando m as se realizan N 1 comparaciones, donde N es el numero total de elementos.

Figura 1: Ilustraci on de la operaci on fundamental del algoritmo MergeSort.

3.1.

Descripci on

Los pasos son lo siguientes: 1. 2. 3. Si N=1 s olo existe un elemento a ordenar y ya se tiene la soluci on. En caso contrario, aplique recursivamente la operaci on mergeSort(...) sobre la primera y segunda mitad del arreglo Finalmente, esto resulta en dos mitades ordenadas que pueden funsionarse utilizando la operaci on fundamental descrita anteriormente.

Detalle de implementaci on: cuando el arreglo a ordenar es peque no (e.g., 20 elementos o menos) dentro de una llamada recursiva, en lugar de continuar recursivamente se utiliza el m etodo de ordenaci on por inserci on.

3.2.

Desempe no

Para realizar el an alisis del algoritmo empleamos la siguiente secuencia: T (1) = 1 y T (N ) = 2 T ( N umero de elementos 2 ) + N , donde N es el n a ordenar. En la parte derecha de la igualdad de la segunda ecuaci on, el primer t ermino de corresponde a las dos llamadas recursivas del algoritmo, mientras el segundo corresponde a la mezcla que es lineal. Sin perder generalidad, supongamos que N = 2n , entonces:

T (2n ) T (2n ) 2n

= = =

2 T (2n ) + 2n T (2n1 ) +1 2n1 T (2n2 ) +1+1 2n2 n 2n n N log (N ) (1)

T (2n ) 2n T (2n ) T (N )

= = =

3.3.

Caracter sticas

El algoritmo de ordenaci on por fusi on: 1. 2. 3. 4. necesita alrededor de N Log (N ) comparaciones para ordenar un archivo de N elementos. utiliza un espacio extra proporcional a N (no es in situ ). es estable. es insensible al orden inicial de la entrada.

4.

QuickSort

Es probablemente el m as utilizado de los algoritmos de ordenaci on. Fue inventado por C.A.R. Hoare2 en 1960 y desde entonces se han propuesto mejoras. Es muy popular porque es relativamente f acil de implementar, ofrece buenos resultados generales, en muchos casos consume menos recursos otros m etodo de ordenaci on, y est a bien estudiado (ha sido expuesto a un minucioso an alisis matem atico que ha sido corroborado con amplia experiencia pr actica). Entre sus ventajas est an: Trabaja in situ.
2

C.A.R Hoare. Quicksort. Computer Journal. Vol. 5, 1 (1962).

10

Emplea N Log (N ) operacionales en promedio para ordenar N elementos. Su bucle interno extremadamente corto. Y sus desventajas: Es recursivo y su implementaci on no recursiva es complicada. El desempe no es N 2 en su peor caso.

4.1.

Descripci on

Es un algoritmo recursivo (de tipo divide y vencer as). Es decir, divide el arreglo en dos partes y las ordena independientemente. A continuaci on se presenta el algoritmo QuickSort en pseudoc odigo. void quicksort(int a[], int izq, int der) { int i; if (der>izq) { i= divide(a, izq, der); quicksort(a, izq, i-1); quicksort(a, i+1, der): } } N otese que la llamada quicksort(a, 0, N-1) ordena el arreglo de N elementos en su totalidad. 4.1.1. Procedimiento de Partici on

El procedimiento de partici on (divide) es una parte escencial del algoritmo. Este procedimiento debe reordenar el arreglo de forma tal que: 1. 2. 3. El elemento a[i] queda en su lugar denitivo dentro del arreglo (pivote). Ninguno de los elementos de a[izq ], , a[i 1] son mayores que a[i]. Ninguno de los elementos de a[i + 1], , a[der] son menores que a[i].

11

Figura 2: Ilustraci on de la operaci on de partici on del algoritmo QuickSort.

12

La Figura 2 ilustra la operaci on de partici on del algoritmo QuickSort. N otese que para realizar la partici on es necesario seleccionar un elemento de pivote. Seguramente lo primero que nos viene a la mente es seleccionar el primer o u ltimo elemento del arreglo ya que podemos considerar que los elementos vienen ordenados al azar. Lamentablemente esto resulta en una partici on pobre si el arreglo est a ordenado o en orden inverso, ya que todos los elementos se van a una de las dos participaciones, y esto ocurre consistentemente en cada llamada recursiva. La consecuencia pr actica de esto es: si el arreglo ya est a ordenado, entonces QuickSort toma un tiempo N 2 para no hacer nada. Como conclusi on, tomar el primer o u ltimo elemento del arreglo como pivote es una idea que debe ser descartada de una vez. Tambi en se nos puede ocurrir seleccionar aleatoriamente un elemento del arreglo. Ciertamente est a alternativa ofrece mayor grado de seguridad pero es costosa y no mejora el tiempo promedio de ejecuci on del algoritmo. Realmente el pivote se selecciona de la siguiente manera: se toman los elementos a[izq ], a[der] y a[(der + izq )/2], se ordenan y se toma el del medio (Figura 3). A este m etodo se le conoce como la Mediana de Tres. Esto elimina el peor caso ya que las particiones son de igual tama no y se ha determinado que reduce el tiempo de ejecuci on en un 5 %.

Figura 3: Ilustraci on de selecci on de pivote por la mediana de 3.

13

A continuaci on se presenta una implementaci on en Java de la selecci on del pivote por la mediana de 3. private static Comparable median3(Comparable a[], int left, int right) { int center = (left+right)/2; if (a[center].compareTo(a[left]) < 0) { swap (a, left, center); } if(a[right].compareTo(a[left])<0) { swap(a, left, right); } if(a[right].compareTo (a[center])<0) { swap(a, center, right); } swap(a, center, right-1); return a[right-1]; } Finalmente, la estrategia de partici on (Figura 4) es como sigue: 1. 2. 3. Se determina el pivote (por la mediana de 3) y se intercambia con el pen ultimo elemento. Se inicializan las variables i = 0 y j = N 2. N otese que j apunta al pivote (pen ultimo elemento). Mientras i est e a la izquierda de j (es decir que i < j ), i se mueve a la derecha (i + +) saltando todos los elementos menores que el pivote. Si se consigue uno mayor o igual se detiene. De forma similar, j se mueve hacia la izquierda (j ) de saltando todos los elementos mayores pivote. Si se consigue uno menor o igual se detiene.

4.

14

5.

Cuando i y j est an parados y se cumple que i < j , entonces los elementos apuntados por i y j son intercambiados. El efecto de esto es poner el elemento grande a la derecha del pivote y el elemento chico a su izquierda. Se repite el proceso hasta que i y j se crucen. Cuando i y j est an parados y se cruzan, no se realiza ning un intercambio. Finalmente, se intercambia el pivote (pen ultimo elemento) con el apuntado por i.

6. 7. 8.

Figura 4: Ilustraci on de la estrategia de particici on del algoritmo QuickSort.

15

N otese que los apuntadores se detienen cuando se consiguen elementos iguales al pivote. Esto se hace porque contribuye a que las particiones sean m as parejas de forma tal que el desempe no del algoritmo tienda a ser N Log (N ). Detalle de implementaci on: cuando el arreglo a ordenar es peque no (e.g., 20 elementos o menos) dentro de una llamada recursiva, en lugar de continuar recursivamente se utiliza el m etodo de ordenaci on por inserci on. Esto mejora en aproximadamente un 15 % el tiempo de ejecuci on del algoritmo.

4.2.

Desempe no

En promedio uno esperar a que cada partici on divida el arreglo por la mitad, lo cual conduce a la siguiente funci on de recurrencia: T (1) = 1 y T (N ) = 2 T ( N ) + N , donde N es el n u mero de elementos a ordenar. 2 Haciendo un an alisis similar al de la Secci on 3.2, obtenemos que en promedio el tiempo de ejecuci on del algoritmo QuickSort es N log (N ).

5.

Colas de Prioridad (Mot culos)

En muchas aplicaciones, se requiere extraer y procesar el mayor elemento de un conjunto, agregar otros elementos al conjunto, y posteriormente, extraer y procesar el mayor elemento del conjunto en ese momento. Para resolver este problema se emplea una estructura de datos denominada Cola de Prioridad. Algunos ejemplos de uso son: 1. 2. 3. Planicaci on de tareas en sistemas operativos (las tareas se planican seg un su prioridad) Simulaci on basada en eventos (las claves se establecen de acuerdo a la cronolog a de los sucesos que deben procesarse) C alculo num erico (las claves corresponden a magnitudes de errores de c alculo)

5.1.

Cola de Prioridad como Tipo de Dato Abstracto

Una cola de prioridad es una estructura de datos que incluye un registro con claves num ericas y que soporta las siguientes operaciones b asicas: 1. Insertar un elemento 16

2. 3.

Extraer el elemento de mayor prioridad Construir una cola de prioridad a partir de N elementos (provenientes de un arreglo o lista).

Adicionalmente, puede se capaz de cambiar la prioridad de un elemento, eliminar un elemento determinado (no necesariamente el de mayor prioridad) y unir dos colas de prioridad, entre otras operaciones.

5.2.

Alternativas de Implementaci on

Como alternativas iniciales est an: Lista enlazada: simplemente los elementos se insertan por el frente (O(1)), pero la extracci on involucra recorrer la lista en b usqueda del elemento de mayor prioridad (O(N )). Lista enlazada ordenada: cada vez que se inserta un elemento se ordena la lista O(N )), y al momento de la extracci on se toma el primer elemento de la lista (O(1)). Arbol binario cl asico: involucra complejidad y uso de recursos innecesarios (enlaces). Con una estructura de datos denominada mont culo se puede lograr implementaciones ecientes de las operaciones m as importantes de una cola de prioridad. Entre sus ventajas es no requiere enlaces y las operaciones se realizan en un tiempo O(log (N )), en el pero caso.

5.3.

Mont culo Binario (Binary Heap)

Un mont culo es un arbol binario completo (completamente lleno excepto el u ltimo nivel) que satisface las siguientes condiciones (Condiciones de Mont culo Binario): cada nodo debe tener mayor o igual prioridad a la de su hijos (si tiene alguno). el nodo de mayor prioridad es la ra z. cualquier sub arbol es un mont culo binario.

17

Un arbol binario completo es sumamente regular3 . Adem as, presenta la ventaja de que puede ser implementado mendiante un arreglo sin necesidad de enlaces. Esto es: para cualquier elemento i, el hijo izquierdo est a en la posici on 2i, el hijo derecho en la posici on 2i + 1 y el padre en la posici on i/2 . (Figura 5)

Figura 5: Ilustraci on de Mont culo Binario. Esto favorece la implementaci on de operaciones simples y r apidas, aunque requiere la estimaci on de la capacidad m axima del arreglo, y su redimensionamiento din amico (e.g., uso de la clase ArrayList). 5.3.1. Algoritmos sobre Mont culos

Los algoritmos b asicos que operan sobre mont culos tienen las siguientes caracter sticas: operan a lo largo de alg un caminodesde la ra z hasta el fondo del mont culo (excepto la unir dos mont culos). comienzan haciendo una simple modicaci on estructural que potencialmente viola las condiciones del mont culo, luego lo recorren y modican para asegurar que dichas condiciones son reestablecidas. Por ejemplo, la operaci on de insertar un nuevo elemento involucra:
Sea h la altura de un arbol binario lleno, entonces 2h n umero de nodos. En consecuencia, h = log (N )
3

2h+1 1, donde N es el

18

1. 2.

agregar el elemento al nal del arreglo, lo cual potencialmente viola la condici on de mont culo. hacer que el elemento reci en agregado suba el mont culo de forma tal que ocupe la posici on que le corresponde y en consecuencia, restaurar la condici on de mont culo.

Por otra parte,la operaci on de extraer el elemento de mayor prioridad consiste en: 1. 2. asignar el primer elemento del arreglo a una variable temporal (item = a[1]). asignar el u ltimo elemento del arreglo a la primera posici on y decrementar el tama no del arreglo (a[1]=a[N--]), lo cual potencialmente viola la condici on de mont culo. hacer que el elemento reci en colocado en la primera posici on del arreglo baje el mont culo de forma tal que ocupe la posici on que le corresponde y en consecuencia, restaurar la condici on de mont culo. retornar el elemento asignado a la variable temporal item.

3.

4.

6.

Ordenaci on por Mont culo

Es un m etodos elegante y ecaz basado en las operaciones b asicas de mont culos. No utiliza memoria extra y garantiza ordenar N elementos en aproximadamente N log (N ). Su bucle interno es m as largo que el de QuickSort. y es en promedio 2 veces m as lento. La idea central del algoritmo es construir un mont culo que contenga todo los elementos a ordenar y despu es suprimirlos hasta dejar vac o el mont culo. A continuaci on se presenta un pseudoc odigo que describe esta idea: public void heapSort(Comparable[] a) { // No se incluye validaci on de par ametro de entrada. int i; Heap heap = new Heap(a.length); for(i=0; i<a.length; i++) { heap.put(a[i]); } 19

for(i=a.legnth-1; i>=0; i--){ a[i]=heap.pop(); } } C odigo anterior es s olo para prop ositos ilustrativos de la idea central. La implementaci on real se caracteriza por: utilizar directamente el c odigo de los procedimientos para evitar llamadas a funciones. no utilizar memoria extra para el mont culo (es in situ ). En realidad es mejor construir el mont culos retrocediendo a trav es de el arreglo, e ir creando peque no submont culos hacia arriba. Este m etodo considera a cada elemento del arreglo como la raiz de un peque no submont culo y se aprovecha del hecho de que la operaci on bajarMonticulo puede aplicarse a esos submont culos. A continuaci on se presenta el m etodo de ordenaci on por mont culo en pseudoc odigo: public static void heapSort(Comparable a[]) { int k; // Creaci on del mont culo sobre el arreglo original for(k=a.length/2; k>=1; k--){ bajarMonticulo(a, a.length, k); } int n = a.length; while(n>1){ swap(a, 1, n); bajarMont culo(a, --n, 1); } }

6.1.

Propiedad 1

La construcci on ascendente del mont culo es lineal. Por ejemplo, para un mont culo de 127 elementos se llama a la operaci on bajarMonticulo para: 20

Mont culos 64 32 16 8 4 2 1

Elementos 1 3 7 15 31 63 127

Posibles Promociones (P P rom) 0x64 1x32 2x16 3x8 4x4 5x2 6x1

T otal = 120 < 127 N otese que la mayor a de los mont culos que se procesan son peque nos.

6.2.

Propiedad 2

La ordenaci on por mont culo utiliza menos de 2N Log (N ) comparaciones para ordenar N elementos (tiempo de ejecuci on N Log (N ) inclusive en el peor caso).

21

You might also like