[C++]Heap- kopiec, stóg, sterta – czyli budujemy kolejkÄ™ piorytetowÄ… !

Kopiec jest strukturą oparta na drzewie, w której wartość rodzica jest zawsze większa(mniejsza) niż wartość potomków, dzięki temu korzeniem jest wartość największa (najmniejsza). Przedstawię w tym wpisie jej implementację tablicową kolejki priorytetowej opartej na kopcu i jej podstawowe funkcje tj. dodawanie do kopca i ściąganie z kopca(obsługiwanie).

Implementacja kopca, kolejki piorytetowej w C++

#include <cstdlib>
#include <iostream>

using namespace std;

int t[500];
int L=0; // ilosc elementow

// dodajemy na ostatni element i segregujemy

//przesun element do gory
void wynurzanie(int i)
{
    if(i>1)
    {
    int ojciec=i/2;
    if(t[i]>t[ojciec])
    {

    swap(t[i],t[ojciec]);
    wynurzanie(ojciec);
    }
    }
}

void zatapianie(int i)
{

if(i<=L)
{
        int l=2*i; // lewy potomek
        int p=l+1; // prawy potomek
        int wiekszy;

        if((l<=L)&&t[l]>t[i])
        wiekszy=l;
        else
        wiekszy=i;
        if((p<=L)&&t[p]>t[wiekszy])
        wiekszy=p;

        if(wiekszy!=i)
        {
         swap(t[i],t[wiekszy]);
         zatapianie(wiekszy);
         }

}

}

void usun()
{
      if(L<1)
    cout<<"Kolejka pusta"<<endl;
    else
    swap(t[1],t[L]);
    L--;
    zatapianie(1);
}

void wstaw(int x)
{
     t[++L]=x;
wynurzanie(L);
}

void wyswietl()
{
for(int i=1;i<=L;i++)
{
        cout<<t[i]<<" jest ojcem "<<t[i*2]<<" i "<< t[i*2+1]<<endl;
}
}

int main(int argc, char *argv[])
{

               wstaw(37);
    wstaw(41);
      wstaw(26);
       wstaw(14);
      wstaw(19);
       wstaw(99);
        wstaw(23);
         wstaw(17);
          wstaw(12);
           wstaw(20);
            wstaw(25);
             wstaw(42);

usun();
usun();

usun();
usun();
  wyswietl();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Ten wpis został opublikowany w kategorii Algortymy i struktury danych, C++, Programowanie, Studia i oznaczony tagami , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>