QuickSort et Hoare Partition

J'ai du mal à traduire QuickSort avec Hoare de partitionnement dans le code en C, et ne peut pas savoir pourquoi. Le code que j'utilise est indiqué ci-dessous:

void QuickSort(int a[],int start,int end) {
    int q=HoarePartition(a,start,end);
    if (end<=start) return;
    QuickSort(a,q+1,end);
    QuickSort(a,start,q);
}

int HoarePartition (int a[],int p, int r) {
    int x=a[p],i=p-1,j=r;
    while (1) {
        do  j--; while (a[j] > x);
        do  i++; while (a[i] < x);

        if  (i < j)
            swap(&a[i],&a[j]);
        else
            return j;
    }
}

Aussi, je ne comprends pas trop pourquoi HoarePartition œuvres. Quelqu'un peut-il expliquer pourquoi cela fonctionne, ou au moins de me lier à un article qui n'?

J'ai vu une étape-par-étape de travail par le biais de l'algorithme de partitionnement, mais je n'ai pas de sensation intuitive. Dans mon code, il n'a même pas l'air de fonctionner. Par exemple, compte tenu de l'éventail

13 19  9  5 12  8  7  4 11  2  6 21

Il va utiliser le pivot de 13 ans, mais jusqu'à la fin avec le tableau

 6  2  9  5 12  8  7  4 11 19 13 21 

Et sera de retour j qui est a[j] = 11. Je pensais que c'était censé être vrai que la matrice à partir de ce point et devraient avoir des valeurs qui sont plus grands que le pivot, mais ce n'est pas le cas ici car 11 < 13.

Ici de pseudo-code de Hoare de partitionnement (à partir de PLC, deuxième édition), dans le cas où c'est utile:

Hoare-Partition (A, p, r)
    x  A[p]
    i  p  1
    j  r + 1
    while  TRUE
        repeat   j   j  1
            until     A[j]  x
        repeat   i   i + 1
            until     A[i]  x
        if  i < j
            exchange  A[i]  A[j]
        else  return   j 

Merci!

EDIT:

Le droit de code C pour ce problème sera à la fin:

void QuickSort(int a[],int start,int end) {
    int q;
    if (end-start<2) return;
    q=HoarePartition(a,start,end);
    QuickSort(a,start,q);
    QuickSort(a,q,end);
}

int HoarePartition (int a[],int p, int r) {
    int x=a[p],i=p-1,j=r;
    while (1) {
        do  j--; while (a[j] > x);
        do  i++; while (a[i] < x);
        if  (i < j) 
            swap(&a[i],&a[j]);
        else 
            return j+1;
    }
}

source d'informationauteur Ofek Ron