Sortowanie metodą quicksort.

0
#include <iostream>

using namespace std;

void quicksort( int * tablica, int lewy, int prawy )
{
    cout << "Lewy: " << lewy << endl;
    cout << "Prawy: " << prawy << endl;
    
    int v = tablica[( lewy + prawy ) / 2 ];
    cout << "v: " << v << endl;
    int i, j, x;
    i = lewy;
    j = prawy;
    do {
        while( tablica[ i ] < v ) i++;
        
        while( tablica[ j ] > v ) j--;
        
        if( i <= j ) {
            x = tablica[ i ];
            tablica[ i ] = tablica[ j ];
            tablica[ j ] = x;
            i++; j--;
            for( int i = 0; i < 7; i++ ) cout << tablica[ i ] << endl;
            
            cout << endl;
        }
    } while( i <= j );
    
    cout << "j po sortowaniu: " << j << endl;
    cout << "Lewy po sortowaniu: " << lewy << endl;
    cout << "i po sortowaniu: " << i << endl;
    cout << "Prawy po sortowaniu: " << prawy << endl << endl << endl;
    
    if( j > lewy ) quicksort( tablica, lewy, j );
    
    if( i < prawy ) quicksort( tablica, i, prawy );
    
}

int main()
{
    int t[ 7 ];
    
    t[ 0 ] = 25;
    t[ 1 ] = 90;
    t[ 2 ] = 102;
    t[ 3 ] = 70;
    t[ 4 ] = 15;
    t[ 5 ] = 250;
    t[ 6 ] = 200;
    
    quicksort( t, 0, 6 );
    
    return 0;
}

Ideę tego sortowania rozumiem. Nie rozumiem natomiast jednego etapu:
Po pewnym czasie, mam w programie wypisane:
"j" po sortowaniu: 0, "Lewy" po sortowaniu: 1, "i" po sortowaniu: 2, "Prawy" po sortowaniu: 2".
Następnie są dwa warunki (if) i żaden z nich się nie spełnia (tzn. ani "j" nie jest większe od "lewy", ani "i" nie jest mniejsze od "prawy"). Pomimo tego program nie kończy swego działania, tylko w dalszym ciągu sortuje ustawiając sobie do zmiennych następujące dane: "Lewy=3", "Prawy=6" i dalej sortuje... **Dlaczego tak się dzieje? **
Ponadto gdy zmienię drugiego if na else if, wtedy program kończy swoje działanie w wyżej opisanym momencie i to jest dla mnie zrozumiałe.
Z góry dziękuję za odpowiedź :)

2

A czemu miałby kończyć działanie? Kończy sie wykonanie danej rekurencji i program wraca do poprzedniego wykonania funkcji. Rozpisz sobie na kartce albo zobacz pod debugerem co się dzieje moze? Przecież możesz zejść bardzo głęboko tutaj w rekurencje.

1

Zauważ, że każda iteracja wywołuje 2 kolejne. Iteracja dokonała podziału i wywołała kolejną na obu podprzedziałach. Co to widzisz to efekt działania sortowania pierwszego przedziału [1,2], jest koniec, a dalej sortuje się drugi przedział [3,6].

0

Już rozumiem, dziękuję! :)

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