Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie przez scalanie - Problem ze zrozumieniem.

Ostatnio zmodyfikowano 2013-12-29 20:28
Autor Wiadomość
masa...
Temat założony przez niniejszego użytkownika
Sortowanie przez scalanie - Problem ze zrozumieniem.
» 2013-12-29 11:33:30
Witam.
Zdaje w tym roku maturę z infy(ROZ). I przerabiam sobię o ten  algorytm:
C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

const int N = 5;
int d[ N ] = { 5, 4, 2, 9, 1 };
int p[ N ];
//int i_p=0;
//int i_k=N-1;
void MergeSort( int i_p, int i_k )
{
    int i_s, i1, i2, i;
   
    i_s =( i_p + i_k + 1 ) / 2;
    if( i_s - i_p > 1 ) MergeSort( i_p, i_s - 1 );
   
    if( i_k - i_s > 0 ) MergeSort( i_s, i_k );
   
    i1 = i_p; i2 = i_s;
    for( i = i_p; i <= i_k; i++ )
         p[ i ] =(( i1 == i_s ) ||(( i2 <= i_k ) &&( d[ i1 ] > d[ i2 ] ) ) ) ? d[ i2++ ]
        : d[ i1++ ];
   
    for( i = i_p; i <= i_k; i++ ) d[ i ] = p[ i ];
   
}



int main( int argc, char ** argv ) {
   
    MergeSort( 0, N - 1 );
    for( int k = 0; k < N; k++ )
         cout << d[ k ] << " ";
   
    return 0;
}

Nie rozumiem dokładnie tej części :
C/C++
if( i_s - i_p > 1 ) MergeSort( i_p, i_s - 1 );

if( i_k - i_s > 0 ) MergeSort( i_s, i_k );


W debugerze na drugim przejściu funkcji i_p=0,i_k=4,p[]={4,5,0,0,0},d[] = {4,5,2,9,1}.
W tym wypadku i_s-i_p jest wieksze od jeden. W jaki sposób przechodzi mi tak funckja do ifa niżej.Nie rozumiem tego. Jeżeli ktoś by mi to prostu wytłumaczyć (Jeżeli się da) bd wdzieczny. Ogólnie wiem o co chodzi w rekurencji. Ale tu jest dla mnie troche nie zrozumiała. [/i]

Edit:
Nadmienie, że ogólnie nadtym już z 3h siedzę. [/i]
P-100463
pekfos
» 2013-12-29 15:44:27
W jaki sposób przechodzi mi tak funckja do ifa niżej.Nie rozumiem tego.
Tak samo, jakby zamiast wywołania było tam cokolwiek innego.

Nadmienie, że ogólnie nadtym już z 3h siedzę.
Co to ma na celu? I tak, na 90%, nie siedzisz nad tym więcej niż pół godziny.
P-100517
masa...
Temat założony przez niniejszego użytkownika
» 2013-12-29 20:28:46
Ja siędze na tym ogólnie rzecz biorąc to pół dnia. Na zrozumienie tego nakierował mnie temat z wieżami Hanoi http://cpp0x.pl/forum/temat/​?id=13131&p=2\

Nie rozumiałem rekurencji do końca. Bardzo mi pomógł post autora pekfos.
C/C++
#include <iostream>

void f( int a )
{
    if( a > 0 )
    {
        std::cout << a << std::endl;
        f( a - 1 );
        std::cout << a << std::endl;
    }
}

int main()
{
    f( 5 );
}
oraz przykład z symfonii (rozdział 5.12). Na zrozumieniu tego.
P-100575
« 1 »
  Strona 1 z 1