Witam, poniżej jest kod algorytmu sortowania przez kopcowanie, znalezionego w internecie:
void rekonstruuj_kopiec(int tab[],int i, int n)
{
int lewy=2*i;
int prawy=2*i+1;
int wiekszy;
if(lewy<n&&tab[lewy]>tab[i])
wiekszy=lewy;
else
wiekszy=i;
if(prawy<n&&tab[prawy]>tab[wiekszy])
wiekszy=prawy;
if(wiekszy!=i)
{
int pom=tab[i];
tab[i]=tab[wiekszy];
tab[wiekszy]=pom;
rekonstruuj_kopiec(tab,wiekszy,n);
}
}
void StworzKopiec(int tab[], int n)
{
for(int i=(n-1)/2;i>=1;i--)
rekonstruuj_kopiec(tab,i,n);
}
void sortowanie_przez_kopcowanie(int tab[],int n)
{
StworzKopiec(tab,n);
for(int i=n-1;i>=1;i--)
{
int pom=tab[1];
tab[1]=tab[i];
tab[i]=pom;
rekonstruuj_kopiec(tab,1,i);
}
}
Wiem jak działa funkcja rekostruuj_kopiec. Sprawdza ona czy któreś z dzieci ma większą wartość od rodzica, jeśli tak to jest zamiana miejsc. Jeśli zamiana byla przeprowadzona, to wywołujemy rekurencyjnie i znów sprawdzamy.
nie rozumiem do końca pozostałych funkcji:
w funkcji "StworzKopiec" dlaczego tak wygląda pętla for?
for(int i=(n-1)/2;i>=1;i--)
oraz nie rozumiem nic z funkcji sortowanie_przez_kopcowanie
for(int i=n-1;i>=1;i--)
{
int pom=tab[1];
tab[1]=tab[i];
tab[i]=pom;
rekonstruuj_kopiec(tab,1,i);
}
prosze o pomoc