Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →