Przykład K&R Qsort ze zmieszaniem wskaźników i tablic

Trudno mi zrozumieć następujący fragment kodu. Rozumiem wskaźnik wskazujący na manieryzm funkcji, ale tam, gdzie znajduję zamieszanie, wskazane linie.

void qsort(void **v, int left, int right, int (*comp) (void *, void *))
{
    int i, last;
    void swap(int **v, int i, int j);

    if (left >= right)   /* do nothing if array contains */
        return;           /* fewer than two elements */
    swap(v, left, (left + right)/2);   /* move partition elem */ [1]
    last = left;                       /* to v[0] */ [2]
    for (i = left + 1; i <= right; i++) /* partition */ [3]
        if ((*comp) (v[i], v[left]) < 0) [4]
            swap(v, ++last, i); [5]
    swap(v, left, last);        /* restore partition elem */ [6]
    qsort(v, left, last - 1); [7]
    qsort(v, last + 1, right);  [8]

}

Czy ktoś może wyjaśnić mi tę procedurę, szczególnie wskazane linie, po prostu powiedz mi, co robi, ponieważ nie mogę obliczyć tego qsortu, przewodnik eskimoski, który czytam podczas czytania k & r, powiedział, że procedura qsort jest śmieciowa i zbyt skomplikowana. Muszę tylko zrozumieć, dlaczego tak jest napisane, ponieważ nie ma to dla mnie sensu.

Dzięki, jeśli nie, za przeczytanie tego.

questionAnswers(5)

yourAnswerToTheQuestion