Example #1
0
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 */
Example #2
0
File: heap.c Project: gbsf/mc202
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 */
Example #3
0
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 */
Example #4
0
File: heap.c Project: gbsf/mc202
/* 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 */
Example #5
0
/* 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 */
Example #6
0
/* 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 */