Quicksort, C++, mój program

0

Hej. Właśnie tu napisałem Quicksort. Niestety nie działa. Męczę się ze znalezieniem błędu i nic. Jak ktoś pomoże będę wdzięczny. Jako piwot przyjąłem pierwszy element tablicy.

#include <iostream>

using namespace std;

void Test(int tab[],int pierwszy,int ostatni)
{
    int lewy=pierwszy;
    int prawy=ostatni;
    int piwot=tab[pierwszy];
    do
    {
        while(tab[lewy]<piwot)
            lewy++;
        while(tab[prawy]>piwot)
            prawy--;
        if(lewy<=prawy)
        {
            swap(tab[lewy],tab[prawy]);
            lewy++;
            prawy--;
        }
    }while(lewy<=prawy);
    swap(tab[pierwszy],tab[prawy]);
    Test(tab,pierwszy,prawy-1);
    Test(tab,prawy+1,ostatni);
}

int main()
{
    const int rozmiar=5;
    int tab[rozmiar]={7,4,2,5,1};
    Test(tab,0,rozmiar-1);
    for(int i=0;i<rozmiar;i++)
        cout << tab[i] << " ";
    return 0;
}
 
0

Pokaż jak robisz swap.

0
Test(tab,pierwszy,prawy-1);
Test(tab,prawy+1,ostatni);

Omijasz element o indeksie prawy.

1

Według mnie, tablica po wyjściu z funkcji pozostanie niezmieniona, bo w funkcji operacje są wykonywane na wirtualnej kopii, która jest usuwana w czasie zakończenia działania funkcji, możesz użyć do tego referencji, czyli:

void Test( int& tab[], int pierwszy, int ostatni) 

.
Poza tym brakuje warunku zakończenia rekurencji tej funkcji, bo nie masz opcji, kiedy funkcja kończy się bez wywołania samej siebie.

1

@Mikilll debuger w dłoń i klikaj. Nikt tego za ciebie nie zrobi.

0

Dobra! Już ogarnąłem panowie. Brakowało warunku zakończenia rekurencji, a także powinno być

int lewy=pierwszy+1;

ponieważ uwzględnianie elementu pierwszego jest bez sensu, gdyż jest to piwot.

#include <iostream>

using namespace std;

void Test(int tab[],int pierwszy,int ostatni)
{
    if(pierwszy>=ostatni) return;
    int lewy=pierwszy+1;
    int prawy=ostatni;
    int piwot=tab[pierwszy];
    do
    {
        while(tab[lewy]<piwot)
            lewy++;
        while(tab[prawy]>piwot)
            prawy--;
        if(lewy<=prawy)
        {
            swap(tab[lewy],tab[prawy]);
            lewy++;
            prawy--;
        }
    }while(lewy<prawy);
    swap(tab[pierwszy],tab[prawy]);
    Test(tab,pierwszy,prawy-1);
    Test(tab,prawy+1,ostatni);
}

int main()
{
    const int rozmiar=5;
    int tab[rozmiar]={7,4,2,5,1};
    Test(tab,0,rozmiar-1);
    for(int i=0;i<rozmiar;i++)
        cout << tab[i] << " ";
    return 0;
}
0

Prościej by było jakbyś na początku napisał co się dzieje, a nie że nie działa i już.

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