[C++] Przerobienie fragmentu kodu na wersję nierekurencyjna

mario5046
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 12 paź 2011, o 15:42
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Przerobienie fragmentu kodu na wersję nierekurencyjna

Post autor: mario5046 »

Witam, pomożecie przerobić poniższą część kodu z wersji rekurencyjnej na wersję nierekurencyjną?

Kod: Zaznacz cały

void heapify(int * tab, int i)
{
   int l = 2*i;
   int r = 2*i+1;
   int largest,x;

   if ((l<=heap_size)&&(tab[l]>tab[i])) largest = l;
   else largest = i;
   if ((r<=heap_size)&&(tab[r]>tab[i])) largest = r;

   if(largest != i)
   {
      x = tab[largest];
      tab[largest] = tab[i];
      tab[i] = x;
      heapify(tab, largest);   
   }
}
to jest fragment kodu sortującego
Ostatnio zmieniony 2 lis 2012, o 15:06 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
knrdk
Użytkownik
Użytkownik
Posty: 36
Rejestracja: 12 mar 2009, o 13:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 5 razy
Pomógł: 7 razy

[C++] Przerobienie fragmentu kodu na wersję nierekurencyjna

Post autor: knrdk »

Zauważ że twoje rekurencyjne wywołanie polega na zamianie i na largest, więc całość funkcji wsadź do pętli

Kod: Zaznacz cały

while(i<=heap_size) 
Rekurencyjne wywołanie zamień na:

Kod: Zaznacz cały

i=largest;
no i gdy i==largest przerwij pętle/wyjdź z funkcji
mario5046
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 12 paź 2011, o 15:42
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Przerobienie fragmentu kodu na wersję nierekurencyjna

Post autor: mario5046 »

Super, bardzo dziękuję za pomoc. Wielki plus dla ciebie
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

[C++] Przerobienie fragmentu kodu na wersję nierekurencyjna

Post autor: Mariusz M »

U niego heap_size jest zmienną globalną ?

Ja coś podobnego znalazłem w sieci

Kod: Zaznacz cały

void heapify(int* tab,int i, int heap_size)
{
      int l,r,largest;
      int x;
      bool isheap=false;
      while((i<=heap_size)&&(!isheap))
       {
             l=2*i;
             r=2*i+1;
             if((l<=heap_size)&&tab[l]>tab[i]) largest=l;
             else largest=i
             if((r<=heap_size)&&tab[r]>tab[largest]) largest=r;
             if(largest!=i)
              {
                     x=tab[largest];
                     tab[largest]=tab[i];
                     tab[i]=x;
                     i=largest;
              }
              else isheap=true;
                  
       }
}
Jaka jest złożoność czasowa takiego kodu
Czy aby na pewno nie wyjdziemy poza zakres typu int
Dlaczego akurat tak należało zbudować instrukcję iteracyjną
oraz instrukcję warunkową w której następuje zamiana
ODPOWIEDZ