<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Tris par sélection et par insertion</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Algorithmes de tri étudiés en Première NSI conformément<br/>
au programme officiel : tri par sélection et tri par<br/>
insertion. Principes, implémentations Python, invariants<br/>
de boucle, terminaison, coût quadratique au pire,<br/>
stabilité, comparaison.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q01 : Qu'est-ce qu'un tri ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie « <strong>trier</strong> une liste » en informatique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trier permet ensuite des opérations efficaces<br/>
(recherche dichotomique, médiane, fusion).<br/>
Au programme de Première : tri par <strong>sélection</strong><br/>
et tri par <strong>insertion</strong>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Réorganiser ses éléments dans un ordre défini (par exemple croissant)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un tri produit une<br/>
<strong>permutation</strong> de la liste d'origine<br/>
respectant un ordre (croissant, décroissant,<br/>
alphabétique, etc.).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Supprimer les doublons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier ne supprime pas les doublons.<br/>
Pour cela, on utilise un set ou une étape<br/>
séparée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Convertir les éléments en chaînes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun changement de type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La couper en plusieurs morceaux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le découpage, pas le tri.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q02 : Tri par sélection : principe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe du <strong>tri par sélection</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sélection : « je cherche le min du non trié, je<br/>
le mets en tête de la partie non triée, je<br/>
recommence sur le reste ». Simple et systématique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Couper la liste en deux et trier chaque moitié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le tri <strong>fusion</strong> (diviser<br/>
pour régner), au programme de Terminale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Insérer chaque élément à sa place dans la partie déjà triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le tri par <strong>insertion</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Sélectionner le plus petit élément non trié et le placer en début de la partie non triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque étape, on cherche<br/>
le minimum du sous-tableau non trié et on<br/>
l'échange avec le premier élément de cette<br/>
partie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comparer chaque paire d'éléments adjacents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait l'idée du tri à bulles,<br/>
qui n'est pas au programme.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q03 : Tri par insertion : principe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe du <strong>tri par insertion</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est exactement comme on trie une main de<br/>
cartes : on prend une carte, on l'insère à sa<br/>
place dans le paquet déjà trié.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Insérer chaque nouvel élément à la bonne place dans la partie déjà triée à sa gauche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on parcourt la liste de<br/>
gauche à droite ; pour chaque élément, on<br/>
le décale vers la gauche tant qu'il est plus<br/>
petit que son voisin de gauche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compter le nombre d'occurrences</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le « tri par comptage », un<br/>
algorithme différent (hors programme).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sélectionner le minimum et le placer en tête</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le tri par <strong>sélection</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Inverser l'ordre des éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune relation avec un tri.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q04 : Échange Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la façon la plus simple d'<strong>échanger<br/>
deux éléments</strong> d'une liste en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'affectation simultanée est utilisée dans les<br/>
tris classiques. Compacte et lisible.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>tmp = liste[i]; liste[i] = liste[j]; liste[j] = tmp</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Code correct mais verbeux. Python offre<br/>
plus simple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>liste.swap(i, j)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode .swap n'existe pas<br/>
sur les listes Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>liste[i] = liste[j]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on perd la valeur originale en<br/>
liste[i].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>liste[i], liste[j] = liste[j], liste[i]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : affectation simultanée,<br/>
syntaxe pythonique. Python crée un tuple<br/>
temporaire (liste[j], liste[i]) puis<br/>
déballe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q05 : Coût au pire cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>coût</strong> au pire cas du tri par<br/>
sélection et du tri par insertion sur une liste<br/>
de longueur n ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Coût quadratique = limite des tris « par<br/>
comparaisons simples ». Pour aller plus vite,<br/>
il faut des stratégies plus malines (diviser<br/>
pour régner, Terminale).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Logarithmique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait possible avec des tris<br/>
avancés (tri fusion en n log n, programme<br/>
de Terminale).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Constant (indépendant de n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun algorithme ne trie en temps<br/>
constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Quadratique (proportionnel à n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux tris sont<br/>
<strong>quadratiques</strong> au pire à cause d'une<br/>
<strong>double boucle</strong> sur la liste. Pour<br/>
n = 1000, on fait ~ 10⁶ opérations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Linéaire (proportionnel à n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop optimiste. La double boucle<br/>
impose plus.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q06 : Tri en place</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie « tri <strong>en place</strong> » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tri <strong>non en place</strong> crée une copie triée<br/>
(par exemple sorted(liste) en Python). Avec<br/>
liste.sort(), on trie en place.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri se fait sur place dans le disque dur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune relation avec le stockage<br/>
physique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri remplace les valeurs par leurs indices</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri ne modifie que l'ordre, pas<br/>
les valeurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri ne fonctionne que sur des listes courtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune restriction de taille.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tri ne crée pas de nouvelle liste : il modifie la liste d'origine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un tri en place utilise une<br/>
quantité de mémoire <strong>constante</strong><br/>
(indépendante de n), juste quelques<br/>
variables temporaires. Sélection et<br/>
insertion sont des tris en place.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q07 : Tri par insertion : meilleur cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le meilleur cas pour le <strong>tri par<br/>
insertion</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette propriété fait du tri par insertion un<br/>
bon choix pour les listes <strong>presque triées</strong><br/>
(par exemple un fichier journal triable au fil<br/>
de l'eau).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Liste déjà triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si la liste est déjà triée,<br/>
chaque élément est déjà à sa place ; on ne<br/>
fait que vérifier (un seul test par<br/>
élément). Coût linéaire (n - 1<br/>
comparaisons).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Liste de longueur impaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la parité de la longueur n'a<br/>
aucune influence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Liste de doublons identiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cas favorable mais pas optimal : chaque<br/>
insertion fait au moins une comparaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Liste triée à l'envers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est au contraire le <strong>pire cas</strong><br/>
pour insertion (chaque élément remonte tout<br/>
à fait à gauche).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q08 : Trace tri par sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On trie [4, 1, 3] par tri par sélection<br/>
(croissant). Que vaut la liste après la<br/>
<strong>première</strong> passe ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tri sélection passe par passe : passe 1 fixe<br/>
l'élément en position 0 ; passe 2 fixe celui en<br/>
position 1 ; etc.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[1, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le résultat <strong>final</strong>, pas<br/>
après une passe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[1, 4, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on cherche le min de la<br/>
liste entière (= 1, indice 1), on l'échange<br/>
avec liste[0]. Résultat : [1, 4, 3].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[3, 4, 1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune permutation cohérente avec<br/>
la sélection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[4, 1, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste a bien été modifiée à la<br/>
première passe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q09 : Tri par insertion : pire cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>pire cas</strong> pour le tri par<br/>
insertion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Symétrie typique : « ordre inverse » est<br/>
souvent le pire cas pour les tris naïfs ;<br/>
« déjà trié » est souvent le meilleur cas pour<br/>
l'insertion.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Liste triée à l'envers (décroissant)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque nouvel élément doit<br/>
être déplacé jusqu'au début de la partie<br/>
déjà traitée, soit n(n-1)/2 décalages au<br/>
total. Coût quadratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Liste déjà triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le <strong>meilleur</strong> cas (linéaire).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Liste avec doublons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas spécifique : le coût dépend de l'ordre,<br/>
pas des doublons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Liste vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas un pire cas : coût constant (la boucle<br/>
ne s'exécute pas).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q10 : Stabilité d'un tri</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un tri est dit <strong>stable</strong> si :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La stabilité est essentielle quand on trie sur<br/>
une clé secondaire après une clé principale<br/>
(par exemple, trier des élèves par âge <strong>puis</strong><br/>
par nom : il faut que le tri par âge préserve<br/>
l'ordre alphabétique).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il préserve l'ordre relatif des éléments égaux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si deux éléments ont la<br/>
même clé de tri, leur ordre dans la<br/>
liste triée est le même que dans la liste<br/>
d'origine. Le tri par insertion est stable ;<br/>
le tri par sélection ne l'est pas en<br/>
général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il fonctionne en temps constant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux et sans rapport.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il ne se trompe jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Trop vague. La correction est exigible<br/>
pour tout tri ; la stabilité est un<br/>
critère plus précis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il ne plante jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Réponse triviale, sans rapport.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q11 : Code tri par sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code implémente correctement le <strong>tri par<br/>
sélection</strong> croissant ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma classique : j_min mémorise l'indice<br/>
du minimum, échange à la fin pour minimiser<br/>
les écritures.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
liste.sort()<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la fonction Python intégrée<br/>
(Timsort en n log n), pas un tri par<br/>
sélection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for x in liste:<br/>
    x = min(liste)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : x est une copie de la valeur,<br/>
on ne modifie pas la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(liste)):<br/>
    j_min = i<br/>
    for j in range(i + 1, len(liste)):<br/>
        if liste[j] &lt; liste[j_min]:<br/>
            j_min = j<br/>
    liste[i], liste[j_min] = liste[j_min], liste[i]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : double boucle ; la boucle<br/>
interne cherche l'indice du min ; échange<br/>
avec liste[i] à la fin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(liste) - 1):<br/>
    if liste[i] &gt; liste[i + 1]:<br/>
        liste[i], liste[i + 1] = liste[i + 1], liste[i]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une seule passe, ne trie pas<br/>
complètement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q12 : Code tri par insertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code implémente correctement le <strong>tri par<br/>
insertion</strong> croissant ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante équivalente : sauvegarder<br/>
valeur = liste[i], décaler à droite les<br/>
éléments plus grands, insérer la valeur. Plus<br/>
économe en échanges.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(liste)):<br/>
    liste.append(min(liste))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ajoute des éléments au lieu de<br/>
réorganiser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(1, len(liste)):<br/>
    j = i<br/>
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:<br/>
        liste[j - 1], liste[j] = liste[j], liste[j - 1]<br/>
        j -= 1<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour chaque élément à<br/>
partir du second, on le décale vers la<br/>
gauche tant qu'il est plus petit que son<br/>
voisin gauche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
while liste != sorted(liste):<br/>
    pass<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Boucle infinie : pass ne modifie rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(liste)):<br/>
    for j in range(i):<br/>
        if liste[i] &lt; liste[j]:<br/>
            liste[i] = liste[j]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : liste[i] = liste[j] écrase la<br/>
valeur sans la sauvegarder. La liste est<br/>
corrompue.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q13 : Liste presque triée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Entre le <strong>tri par insertion</strong> et le <strong>tri par<br/>
sélection</strong>, lequel est le plus rapide sur une<br/>
liste « presque triée » (peu d'éléments mal<br/>
placés) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette propriété de l'insertion explique que<br/>
Python (Timsort, hors programme) bascule sur<br/>
le tri par insertion sur les petits sous-<br/>
tableaux.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux sont équivalents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : leur comportement diffère<br/>
précisément dans le cas favorable.<br/>
L'insertion s'adapte aux données déjà<br/>
triées, la sélection non.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun des deux ne tire profit de la situation, ils sont aussi lents l'un que l'autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il y a une différence importante<br/>
en pratique. Le tri par insertion sait<br/>
tirer parti des données déjà triées, ce<br/>
qui n'est pas le cas du tri par sélection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tri par sélection</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la sélection fait toujours un coût<br/>
quadratique, même sur une liste déjà<br/>
triée. Elle ne sait pas tirer parti de<br/>
l'état des données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Tri par insertion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sur une liste presque<br/>
triée, le tri par insertion est en coût<br/>
linéaire (peu de décalages). C'est pour<br/>
cela qu'on le préfère sur les petites<br/>
listes ou les listes presque triées.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q14 : Invariant tri par sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel <strong>invariant</strong> vérifie le tri par sélection<br/>
après l'itération i de la boucle externe ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet invariant rend la correction du tri par<br/>
sélection évidente. Il combine deux conditions :<br/>
« triés » + « plus petits que les autres ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste est inchangée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on a fait des échanges.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les i premiers éléments sont les plus grands</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse pour un tri<br/>
croissant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les i premiers éléments sont triés et plus petits ou égaux à tous les autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'invariant clé. À la<br/>
fin (i = n), les n premiers (= toute la<br/>
liste) sont triés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste est entièrement triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Trop fort : seules les i premières<br/>
positions sont triées.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q15 : Terminaison</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi les tris par sélection et par<br/>
insertion <strong>terminent</strong> toujours ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Justification rigoureuse : pour chaque boucle,<br/>
identifier ce qui change strictement à chaque<br/>
itération (variant) et la borne qui sera<br/>
atteinte.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que chaque boucle a un variant strict : le for parcourt un range fini, et le while interne du tri par insertion fait décroître strictement j, minoré par 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un for sur un range<br/>
fini termine automatiquement (variant<br/>
implicite). Pour le while du tri par<br/>
insertion, on observe que j décroît<br/>
strictement à chaque tour et reste minoré<br/>
par 0, donc la boucle s'arrête en au<br/>
plus j itérations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que Python limite les boucles à 1000 itérations</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python n'impose aucune telle limite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'aucun tri n'a de boucle while</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri par insertion utilise un<br/>
while.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les listes Python sont finies</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai mais pas la justification suffisante :<br/>
il faut prouver que les boucles s'arrêtent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q16 : Trace tri par insertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On trie [3, 1, 4, 1, 5] par tri par<br/>
insertion croissant. Quel est l'état de la<br/>
liste <strong>après l'itération i = 3</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthode : à chaque itération i, l'élément<br/>
liste[i] rejoint la partie triée<br/>
liste[0..i-1] (en Python : liste[:i]) à sa<br/>
bonne place.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[3, 1, 4, 1, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la liste d'origine non<br/>
modifiée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[1, 1, 3, 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse. Trace : i=1 → [1,3,4,1,5] ;<br/>
i=2 → [1,3,4,1,5] (le 4 ne bouge pas) ;<br/>
i=3 → on insère le 1 (indice 3) à sa place<br/>
: [1,1,3,4,5].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[1, 3, 4, 1, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'état après i = 2<br/>
(l'élément d'indice 2, le 4, est déjà à sa<br/>
place).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[1, 3, 1, 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le 1 doit aller jusqu'à l'indice<br/>
1, pas à l'indice 2.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q17 : Nombre d'échanges sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien d'échanges (au maximum) effectue le<br/>
tri par sélection sur une liste de longueur n ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Caractéristique remarquable du tri par<br/>
sélection : très peu d'échanges, indépendamment<br/>
de l'ordre initial. Avantageux quand les<br/>
écritures sont coûteuses (mémoire flash).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>log n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de mécanisme dichotomique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>n - 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un échange par itération<br/>
de la boucle externe. Quel que soit l'ordre<br/>
initial, on fait au plus n - 1 échanges<br/>
(parfois on évite l'échange si j_min = i,<br/>
mais pour le pire cas, c'est n - 1).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n × (n - 1) / 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'ordre de grandeur des<br/>
<strong>comparaisons</strong>, pas des échanges.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dernière itération est inutile.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q18 : Sélection vs insertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur une liste <strong>déjà triée</strong> de 1000 éléments,<br/>
quel tri est le plus rapide ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choix selon le cas pratique : sélection si<br/>
les écritures sont coûteuses (peu d'échanges),<br/>
insertion si les données arrivent presque<br/>
triées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun ne fonctionne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux algorithmes sont<br/>
parfaitement corrects ; ils<br/>
finiront par trier la liste.<br/>
La question portait sur leur<br/>
performance comparée, et le<br/>
tri par insertion est très<br/>
rapide sur une liste presque<br/>
triée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri par sélection</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il fait quand même le coût<br/>
quadratique (comparaisons), même si peu<br/>
d'échanges.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux sont équivalents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : différence d'ordre de grandeur sur<br/>
ce cas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tri par insertion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sur une liste déjà triée,<br/>
l'insertion est en coût linéaire (~ n<br/>
comparaisons, aucune décale). La sélection<br/>
reste quadratique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q19 : Trier puis chercher</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut faire <strong>plusieurs recherches</strong><br/>
d'éléments dans une liste. Pourquoi peut-il<br/>
être intéressant de la <strong>trier</strong> d'abord ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Investissement initial (tri) vs économie sur<br/>
les recherches futures. Pour une seule<br/>
recherche, le tri n'est pas rentable.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser de la mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier ne change pas la mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun intérêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Au contraire, dès que l'on<br/>
fait plusieurs recherches,<br/>
trier une fois pour toutes<br/>
devient très rentable, car<br/>
chaque recherche passe d'un<br/>
coût linéaire à un coût<br/>
logarithmique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'on pourra ensuite utiliser la recherche dichotomique (coût logarithmique) plutôt que linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tri (n log n par tri<br/>
fusion en Terminale, ou quadratique en<br/>
Première) est un investissement amorti par<br/>
de nombreuses recherches rapides.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour éviter les bugs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Trier ne corrige aucun bug<br/>
dans le code de recherche.<br/>
Le bénéfice du tri préalable<br/>
est purement algorithmique :<br/>
il rend la dichotomie<br/>
applicable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q20 : Tris natifs Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi liste.sort() n'utilise-t-il <strong>pas</strong><br/>
le tri par sélection ou par insertion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Au programme de Première : sélection et<br/>
insertion (compréhension). En pratique<br/>
(Terminale et au-delà) : tris en n log n<br/>
(fusion, rapide, Timsort).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que Python ne sait pas les implémenter</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python sait parfaitement<br/>
implémenter ces tris ; on<br/>
le fait régulièrement à<br/>
des fins pédagogiques. Le<br/>
choix de Timsort est dicté<br/>
par la performance, pas<br/>
par une limitation du<br/>
langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les listes Python ne sont pas modifiables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les listes sont modifiables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'aucun tri n'est implémenté</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode liste.sort()<br/>
existe et trie effectivement<br/>
la liste. Elle s'appuie sur<br/>
Timsort, un algorithme très<br/>
performant intégré au cœur<br/>
de CPython.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que Python utilise un tri plus efficace (Timsort, en n log n) sur les grandes listes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Timsort (hybride mêlant<br/>
insertion sur petits blocs et fusion) est<br/>
beaucoup plus rapide que sélection ou<br/>
insertion. Python applique cependant le<br/>
tri par insertion sur les sous-tableaux<br/>
de moins de ~ 64 éléments.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q21 : Bug d'indice</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(1, len(liste) + 1):<br/>
    j = i<br/>
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:<br/>
        liste[j - 1], liste[j] = liste[j], liste[j - 1]<br/>
        j -= 1<br/>
</code>`<br/>
Pourquoi ce code (tentative de tri par<br/>
insertion) est-il <strong>bogué</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bugs « off-by-one » : très fréquents.<br/>
Toujours tester avec des listes simples<br/>
([], [1], [1, 2]) pour les détecter.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La complexité est trop élevée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité est correcte, c'est<br/>
la borne qui plante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La borne externe est len(liste) + 1 au lieu de len(liste) ; à la dernière itération, on accède à liste[len(liste)] qui n'existe pas → IndexError</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : bug d'<strong>off-by-one</strong>.<br/>
Toujours vérifier les bornes des boucles.<br/>
La forme correcte est range(1,<br/>
len(liste)).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction range n'accepte pas deux paramètres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun bug</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code contient bien une<br/>
erreur de borne : la boucle<br/>
va jusqu'à len(liste)<br/>
inclus, ce qui provoque un<br/>
accès hors tableau lors de<br/>
la dernière itération.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q22 : Nombre de comparaisons</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien de comparaisons effectue le tri par<br/>
<strong>sélection</strong> sur une liste de longueur n,<br/>
quel que soit l'ordre initial ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Différence majeure : insertion s'adapte (cas<br/>
favorable linéaire), sélection ne s'adapte<br/>
pas. Pour de petites listes presque triées,<br/>
préférer l'insertion.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ n²/2 comparaisons (toujours)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle externe fait n<br/>
itérations, l'interne fait en moyenne n/2.<br/>
Total : n × n/2 = n²/2 comparaisons. <strong>Le<br/>
tri par sélection ne tire aucun parti</strong><br/>
d'un ordre favorable : il fait toujours le<br/>
même travail.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ log n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de dichotomie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ n comparaisons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la double boucle impose<br/>
quadratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune si la liste est déjà triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la sélection ne « voit » pas que la<br/>
liste est triée. Elle parcourt quand même<br/>
tout.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q23 : Stabilité de la sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi le tri par <strong>sélection</strong> n'est-il en<br/>
général <strong>pas stable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour avoir un tri par sélection stable, il<br/>
faudrait décaler au lieu d'échanger (plus<br/>
coûteux). En pratique, l'insertion ou un tri<br/>
stable plus efficace est préféré.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'il modifie la liste en place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'insertion aussi modifie en place<br/>
et est stable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que l'échange entre liste[i] et liste[j_min] peut faire passer un élément avant un autre élément égal</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : exemple [2a, 2b, 1]<br/>
(où 2a et 2b sont deux éléments égaux à 2<br/>
dans cet ordre). Sélection trouve min=1,<br/>
échange : [1, 2b, 2a]. L'ordre relatif<br/>
de 2a et 2b est inversé. Donc non stable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'il est lent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : performance et stabilité sont<br/>
indépendantes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'il utilise des doubles boucles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'insertion aussi.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q24 : Choisir un tri</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trier une liste de <strong>5 éléments</strong> dans un<br/>
microcontrôleur où l'on doit <strong>minimiser<br/>
l'écriture en mémoire flash</strong> (les écritures<br/>
sont lentes), quel tri choisir parmi<br/>
sélection et insertion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le choix d'un algorithme dépend du <strong>contexte<br/>
matériel</strong> et des <strong>contraintes</strong> (mémoire,<br/>
énergie, écritures, temps). Pas d'algorithme<br/>
universel.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, il faut un tri à bulles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Hors programme. Et sur le critère du<br/>
nombre d'écritures, le tri par sélection<br/>
est meilleur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tri par insertion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : peut faire jusqu'à n(n-1)/2 = 10<br/>
échanges au pire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Tri par sélection</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il fait au plus n - 1 = 4<br/>
échanges, indépendamment de l'ordre<br/>
initial. Optimal pour minimiser les<br/>
écritures.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, on doit utiliser Timsort</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas idéal sur micro-contrôleur : Timsort<br/>
est complexe à implémenter et n'est pas<br/>
forcément disponible.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur les tris<br/>
au programme (sélection, insertion), laquelle<br/>
est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>À retenir : sélection = peu d'échanges (n-1)<br/>
mais pas stable, ne s'adapte pas au cas<br/>
favorable. Insertion = stable, excellent en<br/>
cas favorable, plus d'échanges au pire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le coût au pire des deux est quadratique.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : caractéristique commune.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux tris peuvent être implémentés en place (sans liste auxiliaire).</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : caractéristique commune.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tri par sélection est stable par défaut.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : le tri par<br/>
sélection n'est <strong>pas</strong> stable en général.<br/>
L'échange peut modifier l'ordre relatif<br/>
d'éléments égaux. L'insertion, elle, est<br/>
stable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri par insertion est en coût linéaire sur une liste déjà triée.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : sa propriété remarquable<br/>
(meilleur cas).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q26 : Tri par insertion par décalage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une variante classique du tri par insertion ne<br/>
fait <strong>pas</strong> d'échanges deux à deux mais un<br/>
<strong>décalage</strong> suivi d'une insertion. Quel code<br/>
met cette idée en œuvre correctement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette variante est en général plus rapide en<br/>
pratique : un décalage = une seule écriture,<br/>
contre deux pour un échange. C'est ce que fait<br/>
Python en interne pour les petits sous-tableaux<br/>
dans Timsort.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(1, len(liste)):<br/>
    valeur = liste[i]<br/>
    j = i<br/>
    while j &gt; 0 and liste[j - 1] &gt; valeur:<br/>
        liste[j] = liste[j - 1]<br/>
        j -= 1<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque la dernière étape<br/>
liste[j] = valeur. La valeur sauvegardée<br/>
n'est jamais réinsérée, et la position<br/>
libérée garde sa valeur précédente déjà<br/>
décalée. La liste est corrompue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(1, len(liste)):<br/>
    valeur = liste[i]<br/>
    for j in range(i, 0, -1):<br/>
        liste[j] = valeur<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on remplit toutes les positions de<br/>
j = i jusqu'à j = 1 avec la même<br/>
valeur. La liste finit par contenir des<br/>
copies multiples du même élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(1, len(liste)):<br/>
    valeur = liste[i]<br/>
    j = i<br/>
    while j &gt; 0 and liste[j - 1] &gt; valeur:<br/>
        liste[j] = liste[j - 1]<br/>
        j -= 1<br/>
    liste[j] = valeur<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on sauvegarde la valeur<br/>
courante, on décale vers la droite tous les<br/>
éléments plus grands à gauche, puis on<br/>
insère la valeur à la position libérée. Une<br/>
seule écriture par décalage (au lieu de deux<br/>
dans la version par échanges), donc plus<br/>
rapide en pratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(1, len(liste)):<br/>
    j = i<br/>
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:<br/>
        liste[j] = liste[j - 1]<br/>
        j -= 1<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on n'a pas sauvegardé la valeur<br/>
d'origine de liste[i] avant de la<br/>
remplacer par liste[j - 1]. Dès la<br/>
première itération, cette valeur est<br/>
perdue, donc l'insertion finale est<br/>
impossible.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q27 : Comparaisons précises sur exemple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien de comparaisons (entre éléments)<br/>
effectue le tri par <strong>sélection</strong> sur la liste<br/>
[5, 3, 8, 1] (n = 4) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Formule à retenir : n(n - 1) / 2<br/>
comparaisons pour le tri par sélection, <strong>quel<br/>
que soit l'ordre initial</strong>. C'est l'ordre de<br/>
grandeur quadratique. Pour n = 1000 :<br/>
499 500 comparaisons.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le nombre d'éléments. La<br/>
double boucle fait beaucoup plus de<br/>
comparaisons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>16</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait n², mais le tri par<br/>
sélection fait n(n - 1) / 2<br/>
comparaisons, pas n². La boucle interne<br/>
ne repart pas de zéro à chaque passe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le nombre d'<strong>itérations</strong><br/>
de la boucle externe (n - 1), pas le total<br/>
des comparaisons internes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la formule générale est<br/>
(n - 1) + (n - 2) + ... + 1 = n(n - 1) / 2,<br/>
soit ici 4 × 3 / 2 = 6. Détail : passe 1<br/>
→ 3 comparaisons (parcours indices 1 à 3) ;<br/>
passe 2 → 2 ; passe 3 → 1. Total : 6.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q28 : Stabilité : application pratique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On a une liste d'élèves représentée par des<br/>
couples (nom, classe), déjà triée par nom.<br/>
On veut maintenant la trier par classe <strong>tout<br/>
en conservant l'ordre alphabétique des noms à<br/>
l'intérieur de chaque classe</strong>. Pourquoi<br/>
faut-il un tri stable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général du tri multi-critères : trier<br/>
d'abord par critère secondaire, puis par<br/>
critère principal avec un tri stable. C'est<br/>
pour cela que la fonction sorted() de Python,<br/>
qui utilise Timsort, est garantie stable.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'un tri stable est plus rapide qu'un tri non stable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la rapidité et la stabilité sont des<br/>
critères indépendants. Le tri par insertion<br/>
est stable et lent ; il existe des tris<br/>
rapides non stables (tri par sélection<br/>
standard, tri rapide).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'un tri stable consomme moins de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la consommation mémoire dépend de<br/>
l'algorithme (en place ou non), pas de la<br/>
stabilité. Le tri par sélection est en<br/>
place mais n'est pas stable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les classes sont des chaînes de caractères</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la stabilité n'a rien à voir avec<br/>
le type des clés. Elle concerne le<br/>
traitement des éléments dont les clés sont<br/>
égales, quel que soit le type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'un tri stable préserve l'ordre<br/>
relatif des élèves ayant la même classe ;<br/>
ainsi, à l'intérieur de chaque classe,<br/>
l'ordre alphabétique des noms (issu du<br/>
premier tri) est conservé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'application typique<br/>
de la stabilité, le tri multi-critères. On<br/>
trie d'abord sur le critère secondaire<br/>
(nom), puis sur le critère principal<br/>
(classe) avec un tri stable. À l'arrivée,<br/>
les élèves sont rangés par classe puis par<br/>
nom.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q29 : Trace pas-à-pas du tri par sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On trie la liste [3, 1, 4, 2] par tri par<br/>
sélection croissant. Quels sont les états<br/>
successifs de la liste <strong>après chaque<br/>
itération de la boucle externe</strong> (chaque<br/>
« passe ») ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour tracer le tri par sélection, on tient<br/>
à jour à chaque passe : (1) la position<br/>
courante (position de la passe), (2)<br/>
l'indice du minimum dans le sous-tableau<br/>
liste[pos:], (3) l'échange éventuel.<br/>
La liste se trie de gauche à droite, un<br/>
élément à la fois. Pour n = 4 éléments,<br/>
3 passes suffisent (la dernière, sur un<br/>
seul élément, est inutile).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Après passe 1 : [1, 3, 4, 2]. Après<br/>
passe 2 : [1, 2, 4, 3]. Après passe<br/>
3 : [1, 2, 3, 4]. La passe 4<br/>
(sur le dernier élément seul) ne<br/>
change rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque passe, on<br/>
cherche le minimum à partir de la<br/>
position courante et on l'échange avec<br/>
l'élément en cette position. Passe 1<br/>
(position 0) : minimum de<br/>
[3, 1, 4, 2] est 1 en position<br/>
1, on échange → [1, 3, 4, 2].<br/>
Passe 2 (position 1) : minimum de<br/>
[3, 4, 2] est 2 en position 3,<br/>
on échange liste[1] avec liste[3]<br/>
→ [1, 2, 4, 3]. Passe 3 (position<br/>
2) : minimum de [4, 3] est 3,<br/>
on échange → [1, 2, 3, 4].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après passe 1 : [3, 1, 4, 2]<br/>
(inchangée). Après passe 2 :<br/>
[1, 3, 4, 2]. Après passe 3 :<br/>
[1, 2, 4, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la première passe modifie<br/>
bien la liste en plaçant le minimum<br/>
1 en position 0. Une passe ne<br/>
laisse la liste inchangée que si<br/>
l'élément en position courante est<br/>
déjà le minimum du sous-tableau, ce<br/>
qui n'est pas le cas ici (la position<br/>
0 contient 3, pas 1).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après passe 1 : [1, 3, 4, 2]. Après<br/>
passe 2 : [1, 3, 2, 4]. Après passe<br/>
3 : [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur à la passe 2 : à partir de la<br/>
position 1, on cherche le minimum<br/>
parmi [3, 4, 2], qui est 2 en<br/>
position 3. On échange donc<br/>
liste[1] (qui vaut 3) avec<br/>
liste[3] (qui vaut 2), ce qui<br/>
donne [1, 2, 4, 3] et non<br/>
[1, 3, 2, 4].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après passe 1 : [1, 2, 3, 4]. Les<br/>
passes suivantes ne changent rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri par sélection ne place<br/>
qu'<strong>un seul</strong> élément à sa position<br/>
finale par passe (le minimum du<br/>
sous-tableau restant). Il faut donc<br/>
plusieurs passes successives, et la<br/>
liste n'est triée qu'à la fin.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q30 : Trace pas-à-pas du tri par insertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On trie la même liste [3, 1, 4, 2] par<br/>
tri par insertion croissant. Quels sont<br/>
les états successifs <strong>après chaque<br/>
itération de la boucle externe</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Différence remarquable avec le tri par<br/>
sélection : à i = 2, le tri par<br/>
insertion ne fait quasiment rien (juste<br/>
une comparaison qui constate que 4 &gt; 3).<br/>
C'est typique : si la liste est presque<br/>
triée, l'insertion devient quasi linéaire,<br/>
tandis que la sélection fait toujours le<br/>
même travail quadratique. Cette propriété<br/>
d'<strong>adaptabilité</strong> rend l'insertion<br/>
préférable sur des données quasi-triées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Après i = 1 (insertion du 1) :<br/>
[1, 3, 4, 2]. Après i = 2<br/>
(insertion du 4) : [1, 3, 4, 2]<br/>
(inchangée, 4 est déjà à sa place).<br/>
Après i = 3 (insertion du 2) :<br/>
[1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque itération i,<br/>
on prend liste[i] et on l'insère à sa<br/>
place dans la portion déjà triée<br/>
liste[0..i-1] (en Python : liste[:i]).<br/>
Pour i = 1, le 1<br/>
remonte avant le 3. Pour i = 2, le<br/>
4 est déjà à sa place (rien à<br/>
faire). Pour i = 3, le 2 remonte<br/>
jusqu'à se placer entre 1 et 3,<br/>
ce qui décale aussi le 3 et le 4<br/>
d'un cran.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après i = 1 : [3, 1, 4, 2]<br/>
(inchangée). Après i = 2 :<br/>
[1, 3, 4, 2]. Après i = 3 :<br/>
[1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la première itération<br/>
(i = 1) insère le 1 à sa place<br/>
dans la portion [3], ce qui le<br/>
place avant le 3. La liste devient<br/>
donc [1, 3, 4, 2] après cette<br/>
itération, pas inchangée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après i = 1 : [1, 3, 4, 2]. Après<br/>
i = 2 : [1, 2, 3, 4]. Après<br/>
i = 3 : [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à i = 2, on insère le 4,<br/>
pas le 2. Le 4 étant déjà à la<br/>
fin de la portion triée [1, 3], il<br/>
n'a pas besoin d'être déplacé. La<br/>
liste reste [1, 3, 4, 2], pas<br/>
[1, 2, 3, 4]. C'est à i = 3, en<br/>
insérant le 2, qu'on obtient le<br/>
tri final.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Identique au tri par sélection :<br/>
[1, 3, 4, 2] puis [1, 2, 4, 3]<br/>
puis [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux algorithmes ne<br/>
produisent pas les mêmes états<br/>
intermédiaires. Au tri par sélection,<br/>
chaque passe place le minimum du<br/>
reste ; au tri par insertion, chaque<br/>
passe insère l'élément suivant à sa<br/>
place dans la partie triée. Les<br/>
comportements à la passe 2 diffèrent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q31 : Trier en ordre décroissant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment adapter un tri par insertion<br/>
croissant pour qu'il trie en ordre<br/>
<strong>décroissant</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette logique se généralise : pour un tri<br/>
avec un critère arbitraire (par âge, par<br/>
nom, par taille, etc.), on n'a qu'à<br/>
modifier la <strong>fonction de comparaison</strong>.<br/>
Python permet cela via le paramètre<br/>
key= de sorted ou list.sort :<br/>
sorted(liste, key=lambda x: -x.age) ou<br/>
reverse=True pour l'ordre décroissant.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Appliquer le tri croissant puis<br/>
inverser la liste finale avec<br/>
liste.reverse()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette approche fonctionne et coûte<br/>
juste un O(n) supplémentaire. Mais<br/>
la question demandait comment<br/>
<strong>adapter</strong> le tri lui-même. Modifier<br/>
la comparaison interne est plus<br/>
élégant et tout aussi efficace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier la liste à l'envers d'abord, puis<br/>
appliquer le tri croissant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « trier à l'envers d'abord »<br/>
n'a pas de sens si on n'a pas encore<br/>
de tri. L'inversion d'une liste se<br/>
fait en O(n), certes, mais ce n'est<br/>
pas la modification la plus simple<br/>
pour adapter un tri.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Multiplier toutes les valeurs par<br/>
-1, trier, puis multiplier à<br/>
nouveau par -1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette astuce fonctionne pour des<br/>
nombres, mais pas pour des chaînes ou<br/>
des objets quelconques. Et elle est<br/>
inutilement compliquée par rapport à<br/>
l'inversion de la comparaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Inverser le sens de la comparaison dans<br/>
la boucle interne : utiliser<br/>
liste[j - 1] &lt; liste[j] au lieu de<br/>
liste[j - 1] &gt; liste[j]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la comparaison entre<br/>
deux éléments adjacents décide si on<br/>
les permute. En inversant le sens, on<br/>
trie dans l'ordre opposé. C'est la<br/>
modification la plus simple et la<br/>
plus localisée. Pour le tri par<br/>
sélection, on cherche le <strong>maximum</strong><br/>
au lieu du minimum à chaque passe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q32 : Comportement avec doublons</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que se passe-t-il quand on trie une liste<br/>
contenant des <strong>doublons</strong>, par exemple<br/>
[3, 1, 3, 2, 3] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Test concret : trier<br/>
[("Alice", 17), ("Bob", 17), ("Chloé", 15)]<br/>
par âge avec un tri stable donne<br/>
[("Chloé", 15), ("Alice", 17), ("Bob", 17)]<br/>
(Alice avant Bob, comme dans la liste<br/>
d'origine). Avec un tri non stable, on<br/>
pourrait obtenir aussi<br/>
[("Chloé", 15), ("Bob", 17), ("Alice", 17)]<br/>
(Bob avant Alice), ce qui peut être<br/>
gênant en pratique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tri fonctionne normalement et<br/>
renvoie [1, 2, 3, 3, 3]. Si le tri<br/>
est stable, l'ordre relatif des<br/>
trois 3 (qui étaient en positions<br/>
0, 2, 4 d'origine) est préservé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les algorithmes de tri<br/>
standard fonctionnent parfaitement<br/>
avec des doublons. La distinction<br/>
stable / non stable porte sur l'ordre<br/>
relatif des éléments <strong>égaux</strong>. Pour<br/>
des entiers, cette distinction est<br/>
invisible (un 3 vaut un 3). Mais<br/>
pour des objets avec des clés<br/>
composites (par exemple<br/>
(nom, age) triés par age), la<br/>
stabilité préserve l'ordre alphabétique<br/>
interne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les doublons sont automatiquement<br/>
supprimés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri ne supprime pas les<br/>
doublons. Il les conserve tous, dans<br/>
l'ordre. Pour supprimer les doublons,<br/>
il faut une étape distincte (par<br/>
exemple convertir en set puis<br/>
retrier).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme tombe en boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun risque de boucle<br/>
infinie. Les comparaisons restent<br/>
déterministes, les indices avancent<br/>
normalement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri lève une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun problème logique avec<br/>
les doublons. Les algorithmes de tri<br/>
sont conçus pour fonctionner avec<br/>
n'importe quelle suite de valeurs<br/>
comparables, doublons compris.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
