Heapsort, prośba o weryfikację

0

Witam. Na zajęciach stworzyliśmy algorytm jak poniżej. Prosiłbym o weryfikację, jako, że sortowanie jest błędne.

void heapty (int tab[], int o, int heapsize) // o - ojciec, l - left, r- right
{
	int l = 2 * o;
	int r = (2 * o) + 1;
	int largest;

	if (l <= heapsize && tab[o] < tab[l])
		largest = l;
	else
		largest = o;

	if (r <= heapsize && tab[largest] < tab[r]) // wyznaczanie indeksu odnoszącego się do największego elementu tablicy
		largest = r;

	if (largest != o)
	{
		swap(tab[o], tab[largest]); // zamiana ojca z największym elementem
		heapty(tab, largest, heapsize); // rekurencja
	}
}

void build_heap(int tab[], int heapsize) // budowa kopca
{
	for (int i = heapsize/2; 0 <= i; i--) 
		heapty(tab, i, heapsize);
}

void heap_sort(int tab[], int size)
{
	int heapsize = size;
	build_heap(tab, heapsize); // budowa kopca

	do {
		swap(tab[0], tab[heapsize]); // zamieniamy największy z ostatnim
		heapsize--; // zmniejszamy rozmiar tablicy, największe elementy odkładają się na ostatnich indeksach tablicy
		heapty(tab, 0, heapsize);
	} while (heapsize > 0);
}

int main()
{
	const int d = 10;
	int tab2[d] = { 23, 45, 23, 11, 24, 65, 931, 11, 2, 40 };

	cout << "PRZED SORTOWANIEM:" << endl << endl;
	for (int i = 0; i < d; i++) // wypisanie posortowanej tablicy
		cout << "tab[" << i << "] = " << tab2[i] << endl;
	cout << endl;

	heap_sort(tab2, d);

	cout << "PO SORTOWANIU:" << endl << endl;
	for (int i = 0; i < d; i++) // wypisanie posortowanej tablicy
		cout << "tab[" << i << "] = " << tab2[i] << endl;

	system("pause");

	return 0;
} 
1

Primo: wrzuć coś co się skompiluje na ideone.com
Secundo:
swap(tab[0], tab[heapsize]); // zamieniamy największy z ostatnim
Przy pierwszym wykonaniu tego kawałka kodu heapsize będzie wynosić 10, a więc będziesz wyjeżdżał poza tablicę (bo dozwolone indeksy to od 0 do 9).

0

http://ideone.com/UgH67W - przesyłam link. Całość przepisywałem z pseudokodu i tam pierwszy ojciec był mnożony jako jedynka - w naszych indeksach jest 0, co pewnie też psuje cały rezultat. Jakiś pomysł, jak to obejść?

2

Rozrysuj sobie drzewko, a potem rozpisz sobie:

  • poziom 0,
  • ojciec 0 - dzieci 1 i 2,
  • poziom 1,
  • ojciec 1 - dzieci 3 i 4,
  • ojciec 2 - dzieci 5 i 6,
  • poziom 2,
  • ojciec 3 - dzieci 7 i 8,
    ...
  • ojciec 6 - dzieci 13 i 14,
  • poziom 3,
  • ojciec 7 - dzieci 15 i 16,
  • itd

Potem spróbuj dopasować wzory.

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