Problem z implementacją sortowania szybkiego w języku C++

0

Witam,
Od jakiegoś czasu uczę się programować w języku C++. Niedawno natrafiłem na pewien problem, a mianowicie na podstawie tego filmiku: chciałem napisać algorytm szybkiego sortowania, jednak coś nie działa i sortowanie
w ogóle nie zachodzi. Proszę o pomoc i wyjaśnienie w czym jest problem. Z góry dziękuję!

Kod programu:

#include <iostream>

using namespace std;

void sortowanie(int *tab, int poczatek, int koniec);

int main()
{
    int n=9;
    int *tab;

    tab = new int [n];

    tab[0]=6;
    tab[1]=1;
    tab[2]=8;
    tab[3]=4;
    tab[4]=5;
    tab[5]=2;
    tab[6]=7;
    tab[7]=3;
    tab[8]=9;

    for(int i=0; i<n; i++)
    {
        cout<<tab[i]<<" ";
    }

    sortowanie(tab,0,n-1);

    cout<<"PO POSORTOWANIU: "<<endl;
    for(int i=0; i<n; i++)
    {
        cout<<tab[i]<<" ";
    }


    delete [] tab;
    return 0;
}

void sortowanie(int *tab, int poczatek, int koniec)
{
    if(poczatek>=koniec)
        return;

    int p = (poczatek+koniec)/2;
    int a=poczatek,b=poczatek,x;

    //zamiana tab[p] z tab[koniec]
    x=tab[koniec];
    tab[koniec] = tab[p];
    tab[p]=x;

    while(true)
    {
        while(tab[a]>tab[p]) a++;


        if(tab[a]<tab[p])
        {
            //swap(tab[a],tab[b]);
            x=tab[b];
            tab[b]=tab[a];
            tab[a]=x;
            a++;
            b++;

        }
        else if((tab[a]==tab[p])&&(a!=koniec))
        {
            //zamiana tab[a] z tab[b]
            x=tab[b];
            tab[b]=tab[a];
            tab[a]=x;
            a++;
            b++;
        }
        else if((tab[a]==tab[p])&&(a==koniec))
        {
            //zamiana tab[koniec] z tab[b]
            x=tab[koniec];
            tab[koniec]=tab[b];
            tab[b]=x;
            break;
        }
        }
}

PS. Na razie nie dodawałem rekurencji, ponieważ chciałem zobaczyć czy liczby choć zmienią swoje położenie po wykonaniu funkcji.

3

Skorzystaj z address sanitizera to od razu znajdziesz problem (przy czym nie analizowałem w ogóle czy podejście do algorytmu jest dobre, a same problemy z pamięcią póki co): https://godbolt.org/z/d6qP6v3ov
BTW, dlaczego nie chcesz używać std::swap?

2

Porównaj z wiki: https://en.wikipedia.org/wiki/Quicksort

Na razie nie dodawałem rekurencji

Jak ma działać to sortowanie, skoro Masz niekompletną implementację. Zapisz to porządnie z wikipedii, weź pod uwagę powyższe @alagner, a potem debuguj.

1

Porównaj z drugim przykładem ze strony: https://www.geeksforgeeks.org/iterative-quick-sort/

0

zdebuguj sobie przypadek:

    const int n=2;
    int *tab=new int [n];

    tab[0]=6;
    tab[1]=1;

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