Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185

    Costruzione heap con procedura bottom-up

    Salve ragazzi, mi potreste aiutare a capire come funziona quest'ordinamento?
    Questo è l'esempio che viene fatto e che non capisco

    Grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    20
    per quello che ricordo la funzione heapsort ha il compito di trasformare un vettore in un heap. Quindi l'elemento in posizione i avrà i figli in posizione 2*i+1 e 2*i+2.
    Detto ciò il primo for ordina in modo che ogni padre ha i figli con valore + basso (quindi ad esempio l'elemento 2 ha un valore maggiore dell'elemento 5 e 6). Parte dal primo nodo che non è una foglia (quindi appunto da n/2). la funzione downheap sarà qualcosa tipo:
    codice:
    void downheap(int A[], int i, int heapsize){
       int l,r, largest;
       l = LEFT(i); //figlio sinistro
       r = RIGHT(i); //figlio destro
      if(l<heapsize && A[l]>A[i])
        largest = l;
      else largest = i;
      if (r<heapsize && A[r]>A[largest])
        largest = r;
      if (largest != i){
        Swap(A, i, largest);
        downheap(A, largest, heapsize);
       }
      return;
    nel while invece scambia il primo elemento con l'ultimo e ripete l'operazione di rimettere in ordine i valori...

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Ti manca di effettuare il controllo che non si esca dagli indici dell' array, e poi non ho capito perché la procedura la richiami solo su largest.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    ho capito il suo funzionamento. Grazie a tutti..

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    20
    Originariamente inviato da Who am I
    Ti manca di effettuare il controllo che non si esca dagli indici dell' array, e poi non ho capito perché la procedura la richiami solo su largest.
    se largest != i allora c'è stato uno spostamento di valori, quindi ricorro nel sottoalbero opportuno per verificare che, dopo tale spostamento, le proprietà dell'heap continuino ad essere rispettate. la funzione downheap non "sale" mai, ma mette "a posto" dal nodo (indice) passato fino al fondo dell'array.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.