Clasificación de montón (montón de raíz grande y montón de raíz pequeño)

(1) ¿Qué es?

Es un algoritmo de clasificación adecuado para situaciones con muchas palabras clave, como seleccionar los primeros 1000 valores máximos o mínimos entre miles de millones.Si
en los algoritmos de clasificación tradicionales (como burbujeo, inserción, etc.), se acostumbra ordenar la datos de destino como un todo, y luego interceptar los primeros 1000 más pequeños o más grandes.
Pero podemos imaginar que nuestro objetivo es solo 1,000 desde el principio, por lo que, de hecho, los 999,999,000 datos restantes, no necesitamos saber su orden de clasificación en absoluto, solo necesitamos saber que todos están comparados El valor máximo de nuestros datos de destino 1000 deben ser grandes.Esto
es clasificación de montón.

Su idea es muy clara y simple en su conjunto, y su estructura es un árbol binario completo.
Si el nodo raíz es más grande que los elementos secundarios izquierdo y derecho, se denomina pila raíz grande. Entre ellos, los nodos raíz de los hijos izquierdo y derecho serán más grandes que sus hijos izquierdo y derecho.
Si el nodo raíz es más pequeño que los hijos izquierdo y derecho, se denomina pila raíz pequeña. Entre ellos, los nodos raíz de los hijos izquierdo y derecho serán más pequeños que sus hijos izquierdo y derecho.
Para decirlo de manera más simple: todos los nodos intermedios deben ser más grandes que sus hijos (gran montón de raíz), o deben ser más pequeños que sus hijos (pequeño montón de raíz)

(2) Cómo construir un montón raíz grande

inicialización:

1: De acuerdo con la matriz dada, primero construya un árbol binario de acuerdo con el nivel de prioridad (colocado capa por capa)
2: Comenzando desde el nodo raíz del último nodo hoja del árbol de clasificación binaria, compare los hijos izquierdo y derecho del nodo, seleccione la permutación más grande para el nodo raíz
3: organice el penúltimo nodo sin hoja, compare y seleccione la permutación más grande para el nodo raíz...
4: y así sucesivamente, hasta que se ordene el árbol completo, en este momento el nodo raíz del árbol Debe ser el valor máximo 5 en el montón raíz grande
: en el proceso de subir el número grande, también depende de si el número en la posición de intercambio es mayor que los hijos izquierdo y derecho, si no , luego elija el más grande para cambiar al nodo raíz secundario.

Por ejemplo: supongamos que hay una matriz [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] que requiere el establecimiento de un gran montón raíz

1: Primero construya un árbol binario de acuerdo con el principio de prioridad jerárquica (después de generar el árbol, se almacena en una matriz unidimensional de forma predeterminada de acuerdo con el recorrido de filas, y el subíndice de la matriz comienza desde 1, es decir, el subíndice 1 almacena el nodo raíz 1, y el subíndice 2 almacena el hijo izquierdo 2, el subíndice 3 almacena el hijo derecho 5, y así sucesivamente)
inserte la descripción de la imagen aquí

2: Comience desde el último nodo sin hoja del árbol binario, compare los hijos izquierdo y derecho del nodo y seleccione la permutación más grande para el nodo raíz Cómo encontrar el último nodo sin hoja del árbol binario: n
/ 2 redondea hacia abajo
este ejemplo, 10 elementos, entonces 10/2 = 5; es decir, el subíndice del último nodo que no es hoja es 5, es decir, el subárbol cuyo valor de nodo raíz es 9.
Comparando 9 y 10, se encuentra que 10 es el más grande, por lo que 10 y 9 intercambian posiciones.

3: Organice el penúltimo nodo no hoja, compare y seleccione el reemplazo más grande del nodo raíz...
Cómo encontrar el penúltimo nodo no hoja: n/2 - 1 = 4
es el subíndice 4, la raíz El subárbol cuyo valor de nodo es 7
compara 6, 7 y 8, por lo que 7 y 8 intercambian posiciones, y 8 es el nodo raíz.


4: Por analogía, hasta que se ordene el árbol completo, el nodo raíz del árbol debe ser el valor máximo en la gran pila de raíces en este momento.
inserte la descripción de la imagen aquí

En este punto, se completa la construcción del gran montón raíz.

Muestra el elemento superior de la pila:

Después de generar 10 en la parte superior de la pila, arréglelo con [el último nodo hoja] 1 y descubra que 1 destruye la naturaleza del gran montón raíz, por lo que debe ajustarse hacia abajo desde el nodo raíz, es decir, compare 1, 9, 5; 9 Coloque el nodo raíz.
1 se hunde en el nodo raíz del subárbol izquierdo, pero aún no satisface la naturaleza de la pila raíz grande, así que compare 1, 8, 3; coloque 8 en el nodo raíz del subárbol izquierdo y 1 se hunde en el subárbol izquierdo del subárbol izquierdo nuevamente Compare 1, 6 y 7 en el nodo raíz del subárbol izquierdo
; reemplace 7 con el nodo raíz del subárbol izquierdo del subárbol izquierdo y sumerja 1 nuevamente.
Hasta ahora, el árbol binario reajustado se ajusta nuevamente a la naturaleza del montón raíz grande.
inserte la descripción de la imagen aquí

Operación de añadir/insertar elemento:

Los elementos recién agregados/insertados son para colocar el nuevo nodo en el último nodo de hoja recién generado y luego comparar el valor de los datos del nuevo nodo de hoja con el valor de su nodo principal para ver si es necesario cambiar la posición. , comience a ajustar, que es la misma operación que la inicialización.

⚠️ Tenga en cuenta que la inicialización y la adición de elementos se ajustan de abajo hacia arriba, mientras que la eliminación del elemento superior de la pila se ajusta de arriba hacia abajo.

Código:

#include <stdio.h>

void HeapSort(int a[], int i, int lenght){
    
    
	/*用以保存子树的根结点*/
	a[0] = a[i];
	/* 按照二叉树性质,不断i*2是不断深入找到下一层的左孩子结点 */
	for(int j=i*2; j<=lenght; j=j*2){
    
    
		/* k是对应子树的右孩子结点,先比较右孩子 */
		int k = j+1; 
		/* 左右孩子比较出一个大值 */
		if(k<lenght && a[k]>a[j]){
    
    
			j = k;
		}
	    /* 判断根结点与左右孩子的最大值谁更大 */
		if(a[0]<a[j]){
    
    
			a[i] = a[j];
			i = j;
		}
	}
	/* 循环退出后,j一定是最适合temp值的地方 */
	a[i] = a[0];
}

int main()
{
    
    
	int a[]={
    
    0,1,3,5,7,9,2,4,6,8,10};
	int lenght = 11;
	/* 从下往上逐个非叶子结点调整 */
	for(int i=lenght/2; i>0; i--) {
    
    
		HeapSort(a,i,lenght);
	}
   
   return 0;
}


Supongo que te gusta

Origin blog.csdn.net/whiteBearClimb/article/details/128172814
Recomendado
Clasificación