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

Merge sort C++

Ostatnio zmodyfikowano 2020-03-09 16:40
Autor Wiadomość
TheFandorn
Temat założony przez niniejszego użytkownika
Merge sort C++
» 2020-03-07 21:31:31
Cześć, mam za zadanie napisać program, który posortuję dwa rosnące ciągi przez scalanie. Posortuje je dopóki pierwszy ciąg nie dobiegnie końca, a następnie dopisze pozostałe wyrazy drugiego ciągu. Niestety z tego co widzę drugi człon funkcji (po pierwszym do - while'u) nie działa poprawnie, bo końcówka sortowania nie dopisuje się (wstawia zazwyczaj losowe liczby) i za Boga nie mogę rozgryźć czemu. 

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void scal( int tab[], int p, int g, int k )
{
    int i = p;
    int j = g;
    int n = 0;
   
    int pom[ 23 ];
   
    // sortowanie początków obu ciągów rosnących
    do
    {
        if( tab[ i ] <= tab[ j ] )
        {
            pom[ n ] = tab[ i ];
            i++;
            n++;
        }
        else
        {
            pom[ n ] = tab[ j ];
            j++;
            n++;
        }
    } while( i < g || j <= k );
   
    if( i == g && j < k ) // dopisanie reszty ciągu
    {
        do
        {
            pom[ n ] = tab[ j ];
            j++;
            n++;
        } while( j <= k );
       
    }
    else if( j == k && i < g )
    {
        do
        {
            pom[ n ] = tab[ i ];
            i++;
            n++;
        } while( i <= g );
       
    }
   
    for( int a = 0; a < 23; a++ )
    {
        tab[ a ] = pom[ a ];
    }
}

int main()
{
    srand( time( 0 ) );
   
    int tab[ 23 ];
    int p, g, k;
   
    tab[ 0 ] = rand() % 10;
    for( int i = 1; i <= 11; i++ )
    {
        tab[ i ] = tab[ i - 1 ] +( rand() % 10 ) + 1;
    }
   
    tab[ 12 ] = rand() % 10;
    for( int i = 13; i <= 22; i++ )
    {
        tab[ i ] = tab[ i - 1 ] +( rand() % 10 ) + 1;
    }
   
    /*
            for(int i=0; i<=22; i++)
        {
            cout << tab[i] << " ";
        }
   
        cout << endl;
    */
    g = 12;
    p = 0;
    k = 22;
   
    scal( tab, p, g, k );
   
    for( int i = 0; i <= 22; i++ )
    {
        cout << tab[ i ] << " ";
    }
    cout << endl;
   
}

Pomoże ktoś? Dzięki
P-176325
pekfos
» 2020-03-08 18:11:19
C/C++
} while( i < g || j <= k );

Na pewno alternatywa między tymi warunkami?
P-176332
TheFandorn
Temat założony przez niniejszego użytkownika
» 2020-03-09 16:40:37
Dzięki, działa! Złe rozumowanie miałem. && i drobna modyfikacja IFów naprawiła sprawę
P-176338
« 1 »
  Strona 1 z 1