Sortowanie elementów w kopcu.

0

Cześć,
mam problem z algorytmem tzw. "kopcowania". Napisałem algorytm wstawiania do tablicy wartości i umieszczania go na odpowiednim miejscu zgodnie z zasadami.
Sugerowałem się tym algorytmem:

K01: 	Dla i = 2, ..., n: wykonuj K02...K05
K02: 	    j ← i;   k ← j div 2
K03: 	    x ← d[i]
K04: 	    Dopóki (k > 0) ∧ (d[k] < x): wykonuj
        d[j] ← d[k]
        j ← k
        k ← j div 2
K05: 	    d[j] ← x
K06: 	Zakończ

I uzyskałem taki kod:

void dodaj_element(int wartosc)
	{
		nowy_koniec(wartosc);   // wstawienie nowej wartości na końcu tablicy (potrzebne gdyż ma być to dynamiczna struktura danych)
		int j, k, x;
		for(int i = 0; i < rozm; i++)
		{
			j = i; 
			k = j / 2;
			x = kopiec[i];
			while((k > 0) && (kopiec[k] < x))
			{
				kopiec[j] = kopiec[k];
				j = k; 
				k = j / 2;
			}
			kopiec[j] = x;
		}
	}

Problem jest w tym, że algorytm działa poprawnie, ale dopiero od 2 elementu (1 elementu tablicy).
Oto przykład:
user image

Z góry dziękuję za pomoc.
Pozdrawiam.

dodanie znacznika <code> dla algorytmu - Furious Programming

0

Może przez to, że masz pętlę for od 0 a w algorytmie jest od 2?

0

No właśnie jak jadę od 2 to jest ten sam efekt.

0

Ta cześć budowania kopca wygląda dobrze. Dlaczego w ogóle za każdym dodaniem budujesz kopiec od nowa? Sprawdź zmienną rozm.

0

Buduję od nowa, bo jak dodam element na dowolnej pozycji, to jest bardzo duże prawdopodobieństwo, że struktura już nie będzie spełniać założeń kopca. Chyba, że jest jakiś inny sposób, o którym nie wiem?

1

Jeżeli brałeś algorytm z tej strony: http://edu.i-lo.tarnow.pl/inf/alg/003_sort/0017.php
to zwróć uwagę, że tablica ma rozmiar n+1 i ma przypisane wartości dla indeksów od 1 do n. Dla tab[0] nie ma nic i tam nigdy nie wchodzimy, dlatego jak masz tablicę indeksowaną od 0, możesz mieć problem właśnie z wartością w tym indeksie.

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