C randomized pivot quicksort (mejora la función de partición)

Soy un estudiante de ciencias de la computación (recién comenzado), estaba trabajando en escribir desde pseudocódigo una versión aleatoria de Quicksort. Lo he escrito y probado, y todo funciona perfectamente sin embargo ...

La partición parece demasiado complicada, ya que parece que me he perdido algo o lo he pensado demasiado. No puedo entender si está bien o si cometí algunos errores evitables.

Tan larga historia corta: funciona, pero ¿cómo hacerlo mejor?

Gracias de antemano por toda la ayuda

void partition(int a[],int start,int end)
{
    srand (time(NULL));
    int pivotpos = 3;   //start + rand() % (end-start);
    int i = start;    // index 1
    int j = end;      // index 2
    int flag = 1;
    int pivot = a[pivotpos];   // sets the pivot's value
    while(i<j && flag)      // main loop
    {
        flag = 0;
        while (a[i]<pivot)
        {
            i++;
        }
        while (a[j]>pivot)
        {
            j--;
        }
        if(a[i]>a[j]) // swap && sets new pivot, and restores the flag
        {
            swap(&a[i],&a[j]);
            if(pivotpos == i)
                pivotpos = j;
            else if(pivotpos == j)
                pivotpos = i;
            flag++;
        }
        else if(a[i] == a[j])       // avoids getting suck on a mirror of values (fx pivot on pos 3 of : 1-0-0-1-1)
        {
            if(pivotpos == i) 
                j--;
            else if(pivotpos == j)
                i++;
            else
            {
                i++;
                j--;
            }
            flag++;
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta