void partition(int *a, int size) { int pivot = a[0]; int left = 0, right = 0; for(left = 1, right = size-1; left = pivot && a[right] <= pivot){ swap(left, right, a); } } swap(0, right, a); }
J’ai écrit cette méthode pour partitionner un tableau comme une étape préliminaire afin d’appliquer un sorting rapide, je l’ai testé sur cet exemple de données:
8 2 5 13 4 19 12 6 3 11 10 7 9
la sortie correcte doit être:
6 2 5 7 4 3 8 12 19 11 10 13 9
mais la sortie réelle est:
6 2 5 13 4 3 8 12 19 11 10 7 9
L’algorithme doit permuter 13
avec 7
mais il échoue à cause de la condition &&
dans la boucle ci-dessus. Je veux incrémenter à left
uniquement si a[left] >= pivot
et décrémenter à right
uniquement si a[right]<= pivot
.
Vous avez plus ou moins répondu à votre propre question. Vous voulez probablement faire quelque chose comme ça:
void partition(int *a, int size) { int pivot = a[0]; int left, right; for(left = 1, right = size-1; left < right; ) { if(a[left] > pivot && a[right] <= pivot) { swap(left, right, a); } if(a[left] <= pivot) left++; if(a[right] > pivot) right--; } }
voici une autre option, un peu plus semblable à l’original
int partition(int arr[], int left, int right) { int pivot = arr[left]; while (left != right) { if (arr[left] > arr[right]) { swap(arr[left], arr[right]); } if (pivot == arr[left]) right--; else // Pivot == arr[right] left++; } return left; }