void Desce(ImplHeap h, int m) { /*Escolhe o filho esquerdo*/ int i = (2*m + 1); /*Copia o valor desejado para uma variavel auxiliar*/ void *aux = h->vetor[m]; /*Verificar se o filho esquerdo existe, ou seja, enquanto nao estiver em uma folha*/ while(i < h->tam){ /*Verifica qual o filho é maior, direito ou esquerdo*/ if(i < (h->tam - 1) && h->comp(h->vetor[i] , h->vetor[i+1]) < 0){ i++; } /*Verifica se aux é maior, se nao, sobe com o valor*/ if( h->comp( aux, h->vetor[i] ) < 0){ h->vetor[m] = h->vetor[i]; m = i; i = 2*i + 1; } else{ break; } } h->vetor[m] = aux; } /* Desce */
void Desce(ImplHeap h, int m) { int k = 2*m + 1; void *elem = h->vetor[m]; while (k < h->tam) { if (k < h->tam - 1 && h->comp(h->vetor[k], h->vetor[k+1]) < 0) k++; if (h->comp(h->vetor[k], elem) > 0) { h->vetor[m] = h->vetor[k]; m = k; k = 2*k + 1; } else { break; } } h->vetor[m] = elem; } /* Desce */
void Desce(ImplHeap h, int m) { /* Desce o valor de um no na "arvore" da FP */ int k = 2*m + 1; void* x = h->vetor[m]; Boolean stop = false; while ((k < h->tam) && (!stop)) { /* Se o no direito for menor que o esquerdo, da-se prioridade ao direito */ if ((k < h->tam-1) && (h->comp(h->vetor[k], h->vetor[k+1]) < 0)) k++; /* Se o valor do no sendo descido for maior que o no "k", entao ele deve ser descido ainda * mais */ if (h->comp(x, h->vetor[k]) < 0) { h->vetor[m] = h->vetor[k]; m = k; k = 2*k + 1; } else stop = true; } /* Quando o no "k" for menor que o no sendo descido, entao o no para de ser descido, ja que * nessa FP, os maiores valores ficam abaixo dos menores */ h->vetor[m] = x; } /* Desce */
/* Funções auxiliares para manipulação de FPs. */ void Sobe(ImplHeap h, int m) { int j = (m - 1) / 2; void *elem = h->vetor[m]; while (m > 0 && h->comp(h->vetor[j], elem) < 0) { h->vetor[m] = h->vetor[j]; m = j; j = (j - 1) / 2; } h->vetor[m] = elem; } /* Sobe */
/* Funções auxiliares para manipulação de FPs. */ void Sobe(ImplHeap h, int m) { /* Sobe o valor de um nó na"árvore" da */ void* x = h->vetor[m]; int pai = (m-1)/2; /* Calculo do pai do no m na heap */ /* Enquanto o valor do no pai for maior que do no sendo subido, deve-se subir ainda mais */ while ((m > 0) && (h->comp(h->vetor[pai], x) < 0)) { h->vetor[m] = h->vetor[pai]; m = pai; pai = (pai-1)/2; } /* No momento em que no no "pai" for menor que o no sendo subido, entao o no para de ser subido, * ja que nessa FP, os menores valores ficam acima dos maiores */ h->vetor[m] = x; } /* Sobe */
/* Funções auxiliares para manipulação de FPs. */ void Sobe(ImplHeap h, int m) { /*Pega a posicao do pai de m*/ int i = (m - 1)/2; /*auxiliar que guada o valor do vetor m*/ void *aux = h->vetor[m]; /*Enquanto m nao for a raiz e enquanto o valor de arvore for menor que o valor que esta subindo*/ while( (m > 0) && h->comp(h->vetor[i], aux) < 0){ h->vetor[m] = h->vetor[i]; m = i; i = (i-1)/2; } h->vetor[m] = aux; } /* Sobe */