heap sort c with examples
Una introducción a la ordenación en pila con ejemplos.
Heapsort es una de las técnicas de clasificación más eficientes. Esta técnica construye un montón a partir de la matriz sin clasificar dada y luego usa la pila de nuevo para ordenar la matriz.
Heapsort es una técnica de clasificación basada en la comparación y utiliza un montón binario.
=> Lea la serie de formación Easy C ++.
comparar dos archivos en linux y encontrar las diferencias
Lo que vas a aprender:
- ¿Qué es un montón binario?
- Algoritmo general
- Ilustración
- Ejemplo de C ++
- Ejemplo de Java
- Conclusión
- Lectura recomendada
¿Qué es un montón binario?
Un montón binario se representa mediante un árbol binario completo. Un árbol binario completo es un árbol binario en el que todos los nodos de cada nivel están completamente llenos, excepto los nodos hoja y los nodos están tan lejos como a la izquierda.
Un montón binario o simplemente un montón es un árbol binario completo donde los elementos o nodos se almacenan de tal manera que el nodo raíz es mayor que sus dos nodos secundarios. Esto también se denomina montón máximo.
Los elementos del montón binario también se pueden almacenar como min-heap en el que el nodo raíz es más pequeño que sus dos nodos secundarios. Podemos representar un montón como un árbol binario o una matriz.
Mientras se representa un montón como una matriz, asumiendo que el índice comienza en 0, el elemento raíz se almacena en 0. En general, si un nodo padre está en la posición I, entonces el nodo hijo izquierdo está en la posición (2 * I + 1) y el nodo de la derecha está en (2 * I +2).
Algoritmo general
A continuación se muestra el algoritmo general para la técnica de clasificación de montones.
- Cree un montón máximo a partir de los datos proporcionados, de modo que la raíz sea el elemento más alto del montón.
- Elimine la raíz, es decir, el elemento más alto del montón y reemplácelo o cámbielo por el último elemento del montón.
- Luego, ajuste el montón máximo, para no violar las propiedades del montón máximo (heapify).
- El paso anterior reduce el tamaño del montón en 1.
- Repita los tres pasos anteriores hasta que el tamaño del montón se reduzca a 1.
Como se muestra en el algoritmo general para ordenar el conjunto de datos dado en orden creciente, primero construimos un montón máximo para los datos dados.
Tomemos un ejemplo para construir un montón máximo con el siguiente conjunto de datos.
6, 10, 2, 4, 1
Podemos construir un árbol para este conjunto de datos de la siguiente manera.
En la representación de árbol anterior, los números entre paréntesis representan las posiciones respectivas en la matriz.
Para construir un montón máximo de la representación anterior, necesitamos cumplir la condición del montón de que el nodo padre debe ser mayor que sus nodos secundarios. En otras palabras, necesitamos 'apilar' el árbol para convertirlo en max-heap.
Después de la acumulación del árbol anterior, obtendremos el montón máximo como se muestra a continuación.
Como se muestra arriba, tenemos este montón máximo generado a partir de una matriz.
A continuación, presentamos una ilustración de un tipo de pila. Habiendo visto la construcción de max-heap, saltaremos los pasos detallados para construir un max-heap y mostraremos directamente el max heap en cada paso.
Ilustración
Considere la siguiente matriz de elementos. Necesitamos ordenar esta matriz usando la técnica de ordenación de pila.
Construyamos un montón máximo como se muestra a continuación para ordenar la matriz.
Una vez que se construye el montón, lo representamos en forma de matriz como se muestra a continuación.
Ahora comparamos el 1S tnodo (raíz) con el último nodo y luego intercambiarlos. Por lo tanto, como se muestra arriba, intercambiamos 17 y 3 para que 17 esté en la última posición y 3 esté en la primera posición.
Ahora eliminamos el nodo 17 del montón y lo colocamos en la matriz ordenada como se muestra en la parte sombreada a continuación.
Ahora volvemos a construir un montón para los elementos de la matriz. Esta vez, el tamaño del montón se reduce en 1 ya que hemos eliminado un elemento (17) del montón.
El montón de los elementos restantes se muestra a continuación.
En el siguiente paso, repetiremos los mismos pasos.
Comparamos e intercambiamos el elemento raíz y el último elemento del montón.
Después de intercambiar, eliminamos el elemento 12 del montón y lo cambiamos a la matriz ordenada.
Una vez más, construimos un montón máximo para los elementos restantes como se muestra a continuación.
Ahora intercambiamos la raíz y el último elemento, es decir, 9 y 3. Después de intercambiar, el elemento 9 se elimina del montón y se coloca en una matriz ordenada.
En este punto, solo tenemos tres elementos en el montón como se muestra a continuación.
Intercambiamos 6 y 3 y eliminamos el elemento 6 del montón y lo agregamos a la matriz ordenada.
aplicación gratuita de conversión de youtube a mp3
Ahora construimos un montón de los elementos restantes y luego intercambiamos ambos entre sí.
Después de intercambiar 4 y 3, eliminamos el elemento 4 del montón y lo agregamos a la matriz ordenada. Ahora solo nos queda un nodo en el montón como se muestra a continuación .
Entonces, ahora con solo un nodo restante, lo eliminamos del montón y lo agregamos a la matriz ordenada.
Por lo tanto, lo que se muestra arriba es la matriz ordenada que hemos obtenido como resultado de la ordenación del montón.
En la ilustración anterior, hemos ordenado la matriz en orden ascendente. Si tenemos que ordenar la matriz en orden descendente, entonces debemos seguir los mismos pasos pero con min-heap.
El algoritmo Heapsort es idéntico al ordenamiento por selección en el que seleccionamos el elemento más pequeño y lo colocamos en una matriz ordenada. Sin embargo, la ordenación por montón es más rápida que la ordenación por selección en lo que respecta al rendimiento. Podemos decir que heapsort es una versión mejorada del ordenamiento por selección.
A continuación, implementaremos Heapsort en lenguaje C ++ y Java.
La función más importante en ambas implementaciones es la función 'heapify'. Esta función es llamada por la rutina principal de clasificación de heap para reorganizar el subárbol una vez que se elimina un nodo o cuando se construye max-heap.
Cuando hayamos agrupado el árbol correctamente, solo entonces podremos obtener los elementos correctos en sus posiciones adecuadas y así la matriz estará ordenada correctamente.
Ejemplo de C ++
A continuación se muestra el código C ++ para la implementación de heapsort.
|_+_|Producción:
que es mejor java o c ++
Matriz de entrada
4 17 3 12 9 6
Matriz ordenada
3 4 6 9 12 17
A continuación, implementaremos el heapsort en lenguaje Java.
Ejemplo de Java
|_+_|Producción:
Matriz de entrada:
4 17 3 12 9 6
Matriz ordenada:
3 4 6 9 12 17
Conclusión
Heapsort es una técnica de clasificación basada en comparación que utiliza un montón binario.
Puede denominarse como una mejora con respecto al ordenamiento por selección, ya que ambas técnicas de ordenamiento funcionan con una lógica similar de encontrar el elemento más grande o más pequeño en la matriz repetidamente y luego colocarlo en la matriz ordenada.
La ordenación de pila hace uso de max-heap o min-heap para ordenar la matriz. El primer paso en la ordenación del montón es construir un montón mínimo o máximo a partir de los datos de la matriz y luego eliminar el elemento raíz de forma recursiva y apilar el montón hasta que solo haya un nodo presente en el montón.
Heapsort es un algoritmo eficiente y funciona más rápido que el ordenamiento por selección. Puede usarse para ordenar una matriz casi ordenada o encontrar k elementos más grandes o más pequeños en la matriz.
Con esto, hemos completado nuestro tema sobre técnicas de ordenación en C ++. A partir de nuestro próximo tutorial, comenzaremos con las estructuras de datos una por una.
=> Busque toda la serie de formación en C ++ aquí.
Lectura recomendada
- Método MongoDB Sort () con ejemplos
- Comando de ordenación de Unix con sintaxis, opciones y ejemplos
- Combinar ordenación en C ++ con ejemplos
- Orden de Shell en C ++ con ejemplos
- Orden de inserción en C ++ con ejemplos
- Orden de selección en C ++ con ejemplos
- Clasificación de burbujas en C ++ con ejemplos
- Clasificación rápida en C ++ con ejemplos