Está en la página 1de 16

Universidad Tecnológica Nacional

Facultad Regional Concepción del Uruguay

Algoritmos y Estructuras de Datos

Métodos de ordenamiento: Heapsort

Cátedra:
Prof. Pontelli, Pascual Hector
AUS. Álvarez, Claudia Mabel

Alumno:
García, Alejo Javier
Índice de contenido

2
Introducción

El presente informe refiere a una actividad de investigación desarrollada en


el marco de la catedra Algoritmos y Estructuras de Datos, en el cual se hará un
estudio del método de ordenamiento heapsort o montículo, teniendo en cuenta sus
aspectos más significativos y su importancia dentro de las estructuras de datos.

Además se brindaran conceptos previos para favorecer el entendimiento del


tema principal, tales como definiciones de árboles, ordenamiento, etc.

3
Desarrollo

Conceptos previos

¿Qué es una estructura de árbol?

“Los árboles son estructuras de datos no lineales y dinámicas de datos


más importantes del área de la computación...”1
Podemos decir que son dinámicas puesto a que estas pueden cambiar
tanto de tamaño como de forma durante la ejecución de un programa y que, al
contrario de lo arreglos2, pueden incrementar o decrementar el número de nodos
en tiempo de ejecución. No lineales puesto a que cada nodo del árbol puede tener
más de un sucesor.

Formalmente definimos un árbol como un dígrafo conexo, cuya estructura


se organiza de forma jerárquica y que posee los siguientes elementos:
Un grupo de objetos o nodos donde uno de los cuales se distingue como raíz y un
conjunto de aristas a las cuales se les da el nombre de ramas, junto con una
relación de “parentesco”,( que está dada por la disposición de las aristas) y que
impone el uso de términos como padre, hijo, hermano, antecesor, sucesor

1
Cairó, Osvaldo & Guardati, Silvi (2002). Estructuras de datos (3ra Edición). McGraw-Hill
2
Estructura de datos estática cuyo tamaño es fijo y no variable durante tiempo de ejecución.

4
Figura 1.a

Se dice que los árboles presentan una estructura jerárquica pues los
elementos, es decir los nodos, se organizan en distintos niveles3 o segmentos
que se disponen de forma vertical.

A continuación se utiliza la Figura 1.a, a modo de ejemplo:


 El nodo A es el nodo raíz del árbol
 Los nodos B y C son hijos de A pues son descendientes directos del mismo
y, a su vez, son hermanos.
 El nodo raíz A es el antecesor de todos los nodos o bien, todos los nodos
son sucesores de este.
 Los nodos B, D, E, y F se denominan terminales u hojas pues no tienen
ramificaciones.
 El nodo C es un nodo interior pues no es ni raíz ni terminal u hoja.

3
Se denomina como niveles o segmentos de un árbol al número de arcos que deben ser recorridos para
llegar a un determinado nodo. Por definición la raíz tiene nivel 1.

5
Métodos de ordenamiento

Introducción

“Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos


en una secuencia específica,

Sea A una lista de N elementos:

A1, A2, A3,...,AN

Definimos ordenar como la permutación de los N elementos de tal forma que


queden de acuerdo con una distribución preestablecida.

[...] La operación de búsqueda –recuperación- de información normalmente


se efectúa sobre elementos ordenados, lo que demuestra que, en general, donde
haya objetos que se deban buscar y recuperar estará presente el proceso de
ordenación.

Los objetos ordenados aparecen por doquier. Directorios telefónicos


registros de pacientes en un hospital, registros de huéspedes en un hotel, índices
de libros en una biblioteca, son tan solo algunos de los ejemplos de objetos
ordenados con los que el ser humano se encuentra frecuentemente”.4

4
Cairó, Osvaldo & Guardati, Silvi (2002). Estructuras de datos 3ra ed. (cap.8, pp. 329-330). McGraw-Hill

6
Formalmente definimos a un método de ordenamiento como un algoritmo5
que pone a los elementos de una estructura en una secuencia dada por una
relación de orden, es decir que este proceso entrega como resultado una
permutación –o reordenamiento- que satisface la relación de orden dada. Si
tenemos en cuenta la lista A de N elementos mencionada anteriormente podemos
enunciarlo de forma simbólica:

Ascendente: A1 ≤ A2 ≤ A3 ≤... ≤ AN

Descendente: A1 ≥ A2 ≥ A3 ≥... ≥AN

Es necesario destacar que los ordenamientos eficientes son importantes


para optimizar el uso de otros algoritmos, por ejemplo los de búsqueda, que
requieren listas ordenadas para una ejecución rápida.

Clasificación

En procesamiento de datos los métodos de ordenación se clasifican en dos


grandes categorías, según donde hayan sido almacenados:

 Ordenación de arreglos.
 Ordenación de archivos.

La primera categoría se denomina también ordenación interna, ya que los


componentes o elementos del arreglo se encuentran en la memoria principal de la
computadora. La segunda categoría se denomina de ordenación externa puesto
que los elementos se encuentran en dispositivos de almacenamiento secundario.
En este último caso los datos se transfieren en bloques a la memoria principal y
luego, ya ordenado, se vuelve a transferir a la memoria secundaria.

5
Conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una
actividad mediante pasos sucesivos.

7
Ordenación interna

En este trabajo se tratará con mayor profundidad la clasificación de


ordenación interna ya que esta reviste de mayor importancia para el tema
estudiado.

Es necesario destacar que a su vez, el modelo de clasificación de arreglos


o interna se clasifica en dos tipos:

 Métodos directos ( n2 )
 Métodos logarítmicos ( n * log n )

Los métodos directos de clasificación tienen la característica de que su


implementación es relativamente sencilla y fácil de comprender, aunque son
ineficientes cuando N –el número de elementos del arreglo- es de tamaño
mediano o grande, es decir que solo son útiles para clasificar listas pequeñas. Los
métodos logarítmicos de clasificación, por su parte, son más complejos y
menos intuitivos por lo que resultan más difíciles de comprender.

Desde el punto de vista de la complejidad computacional6, los métodos


logarítmicos son más eficientes que directos ya que requieren menos
comparaciones y movimientos para ordenar sus elementos, lo que permite menos
utilización de memoria y recursos computacionales.

6
Teoría de la computación que estudia el tiempo que le toma a un algoritmo resolver una determinada
cantidad de problemas.

8
Ordenación por método Heapsort

El método de ordenación heapsort se conoce también como montículo. Su


nombre se debe a su autor, J. W. Williams, quien lo desarrollo en el año 1964. Es
el más eficiente de los métodos de ordenación que trabaja con árboles. Este
algoritmo puede expresarse por medio de dos operaciones generales:

1. Construir un montículo.
2. Eliminar la raíz del montículo de forma repetida.

“Es importante señalar que: Para todo nodo del árbol se debe cumplir que
su valor sea mayor o igual que el valor de cualquiera de sus hijos”.7

La estructura de datos de árbol parcialmente ordenado es adecuada para


poder realizar este algoritmo. Sin embargo un árbol parcialmente ordenado puede
representarse a su vez como un montículo, un arreglo que cumple con la
propiedad del mismo.

Por ejemplo, si tuviésemos un arreglo A con N elementos, y tomamos A [i] como


un elemento dentro del arreglo, se debe verificar que:

 A [i].clave ≤ A [2*i].clave
 A [i].clave ≤ A [2*i+1].clave

Al considerar los elementos 2i y 2i+1 como hijos del elemento i, el arreglo forma un
árbol binario equilibrado en el cual la clave del padre nunca excede a las claves
de los hijos.

7
Cairó, Osvaldo & Guardati, Silvi (2002). Estructuras de datos 3ra ed. (cap.8, pp. 362-371). McGraw-Hill

9
En la 2.a se puede observar que, para cualquier nodo K del arbol, su valor
es mayor o igual que el de cualquiera de sus hijos.

De la misma manera se puede representar este monticulo como un arreglo


lineal, teniendo en cuenta lo siguiente:

 El nodo I se almacena en la posición I correspondiente al arreglo.


 El hijo izquierdo del nodo I se almacena en la posición 2 * I
 El hijo derecho del nodo I se almacena en la posición 2 * I + 1

La figura 2.b contiene la representación del montículo como un arreglo


unidimensional

Figura 2.b

10
Por ejemplo, si quisiéramos obtener el hijo izquierdo del nodo A [5], cuyo
valor es 21, se duplica el valor de la posición del nodo, en este caso 5 y se obtiene
el resultado A [5 * 2]=A [10], cuyo valor es 15. Si deseamos obtener el hijo
derecho del mismo nodo, se duplica el valor de la posición del mismo y se le suma
1, así se obtiene el siguiente resultado A [5*2+1]=A [11], cuyo valor es 08.

A su vez, para calcular el padre de un nodo no raíz I cualquiera, se divide


por 2 al valor de la posición del nodo en el vector, y se toma la parte entera de
este resultado. Así, si quisiéramos calcular el padre del nodo A [4], cuyo valor es
24, se hace A [parte entera (4/2)]=A [2], cuyo valor es 36.

Inserción de un elemento al montículo

La inserción de un elemento al montículo se lleva a cabo por medio de dos pasos:

1. Se inserta el elemento en la primera posición disponible.


2. Se verifica si su valor es mayor al de su padre, si esta condición se cumple,
se efectúa el intercambio entre los elemento. De no ser así el algoritmo se
detiene y el elemento queda ubicado en la posición correcta en el
montículo.

El segundo paso se ejecutara de manera recursiva de abajo hacia arriba.

Eliminación de un elemento
1. Se reemplaza la raíz con elemento que ocupa la última posición del
montículo.
2. Se verifica si el valor de la raíz es menor que el más grande de sus hijos. Si
se cumple esta condición, entonces se efectúa el intercambio. Si no se
cumple esta condición entonces el algoritmo se detiene y el elemento
queda ubicado en su posición correcta.

El segundo paso se ejecutara de manera recursiva de abajo hacia arriba.

11
Algoritmo
A continuación se muestran los códigos en lenguaje PASCAL de los
procedimientos empuja y heapsort, que opera sobre un arreglo A definido de
forma externa. Mediante una secuencia de intercambios empuja lleva los
elementos hasta su lugar adecuado entre sus descendientes en el árbol.

Procedure empuja (primero, ultimo: integer);


var
r : integer; { indica la posición actual de A [primero] }
begin
r := primero { asignación de valor inicial}
while r < = ultimo div 2 do
if ultimo = 2*r then begin
if A [r].clave > A [2*r].clave then
intercambia (A [r], A [2*r]);
r := ultimo { fuerza la terminación del ciclo while }
end
else
if A [r].clave > A [2*r].clave and
A [2*r].clave <= A [2*r+1].clave then begin
{ intercambia r con su hijo izquierdo }
Intercambia (A [r].clave, A [2*r]);
r := 2*r
end
else if A [r].clave > A [2*r+1].clave and
A [2*r+1].clave < A [2*r].clave then begin
{ intercambia r con su hijo derecho }
Intercambia (A [r].clave, A [2*r+1]);
r := 2*r+1
end
else { r no viola la propiedad de árbol parcialmente ordenado}
r :=ultimo
end;

12
Este es el código del procedimiento heapsort completo que utiliza internamente el
procedimiento empuja.

Procedure heapsort;
{ clasifica el arreglo A[1],…,A[n] en forma decreciente }
var
i: integer;
begin
for i:= n div 2 downto 1 do
empuja (i,n);
for :=n downto 2 do begin
intercambia(A [1], a [i]);
{ elimina el mínimo del frente del montículo }
empuja (1, i-1)
{ reestablece la propiedad de árbol parcialmente ordenado }
end
end;

13
Análisis de la clasificación por montículos

Si bien el tiempo es de O(nlogn) en el peor caso, heapsort llevará en


promedio más tiempo que quicksort y puede llegar a ser más lento (se estima un
70%).

La clasificación por montículos tiene especial interés porque es el primer


algoritmo que se ha estudiado que responde a un tiempo de ejecución nlogn en el
peor caso (a diferencia del quicksort que responde a un tiempo de ejecución n2) y
su utilidad es practica cuando no se desean clasificar los n elementos, si no solo
las k menores de entre ellos, siendo k un número mucho menor a n.

14
Conclusión

15
Bibliografía

 Cairó, Osvaldo & Guardati, Silvi (2002). Estructuras de datos (3ra Edición).
McGraw-Hill.

 Aho, Alfred V., Hopcroft, John E. & Ullman, Jefrey D. (1988). Estructuras de
datos y algoritmos. México, DF: Allison-Wesley

16

También podría gustarte