Ejemplo de K&R Qsort con punteros y arrays de confusión

Me resulta difícil entender el siguiente fragmento de código. Entiendo que el puntero para la función demostrada manierismo, pero donde encuentro confusión es en las líneas indicadas.

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]

}

Alguien me puede explicar esta rutina, especialmente las líneas indicadas, solo dígame qué está haciendo, porque no puedo descifrar este qsort, la guía esquimal que leí mientras leía k & r dijo que la rutina qsort es basura, y muy complicada. Solo necesito entender por qué está escrito así, porque no tiene sentido para mí.

Gracias, si es por nada, por leer esto.

Respuestas a la pregunta(5)

Su respuesta a la pregunta