algorithmique (école d'ingénieur) · Chapitre 11 · Exercice de TD
Négatifs en tête
Programmes justes : logique de Hoare et invariants · niveau 2
Énoncé
Écrire, sur un invariant à trois zones, une fonction qui place en tête d'un tableau d'entiers toutes ses valeurs négatives, en et sans tableau auxiliaire. Faire un schéma de l'invariant, donner l'initialisation, la progression et l'arrêt. Combien d'échanges fait-elle dans le pire cas ?
Corrigé
Invariant : « ne contient que des valeurs négatives, que des valeurs positives ou nulles, et n'a pas encore été examiné ».
- Initialisation : , les trois zones , , .
- Progression : ; après échange de et (la valeur positive passe en fin de zone du milieu).
- Arrêt : ; les négatifs occupent .
static void negatifsEnTete(int[] T) { int n = T.length;
int i = 0, k = 0; // I(0,0)
while (k != n) { // I(i,k) et k ≠ n
if (T[k] < 0) { // échanger T[i] et T[k]
int t = T[i]; T[i] = T[k]; T[k] = t;
i = i + 1;
}
k = k + 1; // I(i,k)
} // I(i,n) : T[0:i] < 0 et T[i:n] ≥ 0
}
tours : . Il y a un échange par valeur négative, donc échanges dans le pire cas (tableau entièrement négatif, où chaque échange échange une case avec elle-même). Sur le tableau
la fonction fait quatre échanges et donne
nom : T
valeurs : -1 -1 -5 -2 4 9 3 6
vert : 0..3
pointeurs : i=4 k=n
zone : 0..3 < 0
zone : 4..7 ≥ 0
legende : à l'arrêt, k = n : les négatifs occupent T[0:i]
L'ordre des positifs n'est pas conservé.
100 % gratuit
La suite du chapitre est sur Adloun
- 12 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.