Sortowanie przez kopcowanie – wytłumaczenie

0

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

0

1. "w funkcji "StworzKopiec" dlaczego tak wygląda pętla for?"

Jak powstaje kopiec? Najpierw tablicę układa się po kolei w drzewo binarne, a potem przestawia się jego elementy tak, aby utworzyły kopiec. Jak sobie wybrazić drzewo na początku, to od indeksu : floor(n/2) + 1, wszystkie dalsze elementy są liściami, które można traktować jako jednoelementowe kopce, na początek algorytmu. Stąd zaczynamy w połowie i idziemy w górę (wywołując po drodze rekonstruuj_kopiec).

2. HeapSort.

  • Najpierw budujemy kopiec; widac, że największy element jest na górze, więc, aby ustawić go na właściwe miejsce (czyli na koniec) zamieniamy go z ostatnim.
  • Możemy zapomnieć o tym elemencie odrzucając go z kopca - czyli dekrementując heapsize o jeden (nie widze tego u Ciebie!!!). Dzieci korzenia, w tym nowym kopcu są dalej kopcami, ale korzeń narusza własność, więc odpalamy na nim rekonstruuj__kopiec i tak dalej aż do kopca z dwóch elemetów, gdzie wystarczy je zamienić i posortowane.

Nie widzę nigdzie u Ciebie wykorzystanej długości kopca i wydaje się, że Masz mix indeksowania od zera i jeden. Tu: http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap07.htm
wyglądam mi to na opisane "toczka w toczkę", jak w CLRS, Zajrzyj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1