Estructura de datos: al insertar un montón raíz grande, como se muestra en la siguiente figura
Supongamos que los elementos de la gran matriz del montón raíz son a[1], a[2],..., a[n], los subíndices comienzan desde 1 y a[0] puede ser se usa para guardar datos temporalmente
p>
El último elemento agregado debe ser un nodo hoja, aquí un [n 1], asumiendo que su subíndice es k
Entonces el subíndice de su nodo padre es k/2, en el montón raíz grande El valor del nodo padre debe ser mayor o igual que el nodo hijo
Entonces a[k] se ajustará hacia arriba y se comparará constantemente con su nodo principal, y el valor mayor que el nodo principal se copiará hacia abajo
Deténgase hasta que a[k] sea menor o igual que el nodo principal y luego inserte el valor de a[n 1] en la posición actual de a[k]
El código de referencia es el siguiente:
Por favor, observe que el proceso de inserción es exactamente opuesto a la dirección de HeapAdjust() en la Figura 2, uno es ajuste hacia arriba y el otro es ajuste hacia abajo
El código fuente es el siguiente:
//Ajusta la raíz hacia arriba del nodo Hoja a[k] en el montón
void MaxHeapFixup(int a[], int k) {
a[0] = a[k] // a[0 ] Guardar temporalmente a[k]
int i; // a[i] es el valor del nodo padre de a [k]
for (i = k/2; i gt ;= 1; i = i/2) {
if (a[i] gt;= a[k]) // Satisface que el nodo padre no sea menor que su nodo hijo, es decir, el valor del nodo padre no es menor que el valor de su nodo hijo. e., encuentre la posición de inserción
break;
else {
a[k] = a[i] // else copie el valor de nodo padre más pequeño hasta sus hijos
k = i
}
}
a[k] = a[0] ; //Inserta el nodo hoja en la posición actual que cumple con las condiciones del montón raíz grande
}