[C] QuickSort - zapętlenie przy dwóch takich samych liczbach

0

Próbuję zaimplementować algorytm QuickSort na podstawie książki Cormena. Poniższy kod działa dla tablic, w których dana liczba nie występuje więcej niż jeden raz, w przeciwnym wypadku się zapętla.

long long quickSort_podziel(long long *danaTab, long long n, long long p, long long r)
{

    long long x, i, j, tmp;
    x = danaTab[p];
    i = p; // różnica w stosunku do pseudokodu
    j = r; // różnica w stosunku do pseudokodu
    while (1)
    {
        while (danaTab[j] > x)
        {
            j--;
        }
        while (danaTab[i] < x)
        {
            i++;
        }
        if (i < j)
        {
            tmp = danaTab[i];
            danaTab[i] = danaTab[j];
            danaTab[j] = tmp;
        }
        else
        {
            return j;
        }
    }
}

void quickSort(long long *danaTab, long long n, long long p, long long r)
{
    long long q;
     if (p < r)
     {
        q = quickSort_podziel(danaTab, n, p, r);
        quickSort(danaTab, n, p, q);
        quickSort(danaTab, n, q + 1, r);
     }
}

Tak wygląda pseudokod, na którym się wzorowałem:
http://www.fotosik.pl/showFullSize.php?id=9c92dff1dfb5ae29

Autor sortuje tablicę indeksowaną od 1, a w C jak wiadomo indeksuje się od 0. Dałem j = p zamiast j = p - 1 oraz i = r zamiast i = r + 1, gdyż za chwilę odwoływałbym się do elementu tablicy o indeksie -1. Nie mam już pomysłu co zmienić, żeby algorytm działał dla dowolonych danych... Pomoże ktoś?

0

Abstrahując już od tego, że w parametrze podajesz dziwne n, które nigdzie nie jest używane i od tego, że jest gotowiec w co najmniej kilku językach na wiki... to w funkcji quickSort_podziel w pętlach masz złe warunki. Powinno być

while (danaTab[j] >= x)
 //...
while (danaTab[i] <= x)

przynajmniej wg algorytmu, do którego podałeś link. Nie wiem natomiast, czy to jest Twój problem - nie sprawdzałem.

0

Warunki tu akurat są dobre, w algorytmie jest repeat.. until, a ja mam while, więc użyłem warunków komplementarnych.

W parametrach jest n, bo pisząc inne sortowania zawsze przekazywałem tablicę i jej rozmiar. Akurat tego tutaj nie wykorzystałem, ale nie usunąłem tego.

W pewnym momencie zależało mi, żeby przerobić właśnie ten kod, dlatego poprosiłem o pomoc. W zasadzie w tym momencie nie jest już mi to niezbędne - można temat zamknąć, dzięki za zainteresowanie.

Pozdrawiam.

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