<?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 selon un ordre défini</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, il faut une étape séparée, par<br/>
exemple un parcours qui ne recopie dans une<br/>
nouvelle liste que les valeurs pas encore<br/>
vues.</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 découper en plusieurs morceaux de tailles égales</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 : couper la liste en deux n'est pas sélectionner un<br/>
minimum. Le tri par sélection ne découpe rien : il cherche le plus<br/>
petit élément de la partie non triée.</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 minimum non trié et le placer en tête du reste</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 systématiquement chaque paire d'éléments voisins adjacents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : comparer des voisins deux à deux n'est pas chercher le<br/>
minimum de tout le reste de la liste.</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 élément à sa place dans la partie déjà triée</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 : compter les occurrences d'une valeur ne réordonne pas la<br/>
liste. Le tri par insertion place chaque élément à sa place dans<br/>
la partie déjà triée.</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 complètement l'ordre de tous les éléments de la liste</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 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><code>tmp = liste[i]; liste[i] = liste[j]; liste[j] = tmp</code></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><code>liste.swap(i, j)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode <code>.swap</code> n'existe pas<br/>
sur les listes Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>liste[i] = liste[j]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on perd la valeur originale en<br/>
<code>liste[i]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>liste[i], liste[j] = liste[j], liste[i]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : affectation simultanée,<br/>
syntaxe pythonique. Python crée un tuple<br/>
temporaire <code>(liste[j], liste[i])</code> 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>Le coût quadratique vient de la double boucle : pour chacun des n<br/>
éléments, on parcourt une partie de la liste. Doubler la taille de<br/>
la liste multiplie donc le temps de calcul par quatre environ.</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 : aucun tri ne peut être logarithmique, il faut au moins<br/>
examiner les n éléments une fois.</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 <code>sorted(liste)</code> en Python). Avec<br/>
<code>liste.sort()</code>, 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 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 mélangée aléatoirement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le cas moyen, de coût<br/>
quadratique (chaque élément remonte en<br/>
moyenne la moitié de la partie triée).</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 <code>[4, 1, 3]</code> 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><code>[1, 3, 4]</code></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><code>[1, 4, 3]</code></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 <code>liste[0]</code>. Résultat : <code>[1, 4, 3]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[3, 1, 4]</code></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><code>[4, 1, 3]</code></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 comportant de nombreuses valeurs en double</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 entièrement vide, sans aucun élément à traiter</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 — Q11 : Code tri par sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code implémente correctement le <strong>tri par sélection</strong> croissant ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma classique : <code>j_min</code> 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[<pre><code>for i in range(len(liste)):
    j_min = i
    for j in range(i + 1, len(liste) - 1):
        if liste[j] &lt; liste[j_min]:
            j_min = j
    liste[i], liste[j_min] = liste[j_min], liste[i]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>len(liste) - 1</code> exclut le dernier<br/>
élément de la recherche du minimum. S'il est<br/>
le plus petit, il n'est jamais déplacé :<br/>
<code>[2, 3, 1]</code> reste <code>[2, 3, 1]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for i in range(len(liste)):
    j_min = i
    for j in range(i + 1, len(liste)):
        if liste[j] &gt; liste[j_min]:
            j_min = j
    liste[i], liste[j_min] = liste[j_min], liste[i]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la comparaison est inversée<br/>
(<code>&gt;</code> au lieu de <code>&lt;</code>) : la boucle interne<br/>
cherche le <strong>maximum</strong>, ce code trie donc<br/>
en ordre <strong>décroissant</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for i in range(len(liste)):
    j_min = i
    for j in range(i + 1, len(liste)):
        if liste[j] &lt; liste[j_min]:
            j_min = j
    liste[i], liste[j_min] = liste[j_min], liste[i]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : double boucle ; la boucle<br/>
interne cherche l'indice du min ; échange<br/>
avec <code>liste[i]</code> à la fin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for i in range(len(liste) - 1):
    if liste[i] &gt; liste[i + 1]:
        liste[i], liste[i + 1] = liste[i + 1], liste[i]</code></pre>]]></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 insertion</strong> croissant ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante équivalente : sauvegarder<br/>
<code>valeur = liste[i]</code>, 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[<pre><code>for i in range(len(liste)):
    liste.append(min(liste))</code></pre>]]></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[<pre><code>for i in range(1, len(liste)):
    j = i
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:
        liste[j - 1], liste[j] = liste[j], liste[j - 1]
        j -= 1</code></pre>]]></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[<pre><code>for i in range(1, len(liste)):
    j = i
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:
        liste[j - 1], liste[j] = liste[j], liste[j - 1]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque le <code>j -= 1</code> dans le<br/>
<code>while</code> : l'élément n'est remonté que<br/>
d'une seule position, et le tri échoue<br/>
dès qu'un élément doit remonter de plus<br/>
d'une case (tester sur <code>[3, 4, 1]</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for i in range(len(liste)):
    for j in range(i):
        if liste[i] &lt; liste[j]:
            liste[i] = liste[j]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>liste[i] = liste[j]</code> é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 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é explique qu'on préfère le tri par insertion sur les<br/>
petites listes ou sur les listes presque 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>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>Le tri par sélection, car il effectue moins d'échanges</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la sélection fait certes peu<br/>
d'échanges, mais son nombre de<br/>
<strong>comparaisons</strong> reste quadratique quel<br/>
que soit l'état de la liste. Sur une<br/>
liste presque triée, l'insertion (coût<br/>
quasi linéaire) l'emporte largement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Impossible à prévoir sans connaître les valeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas besoin des valeurs, on<br/>
raisonne sur les algorithmes : l'insertion<br/>
s'arrête dès que l'élément est à sa place,<br/>
la sélection balaie toujours tout le reste<br/>
de la liste.</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 <code>i</code> 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 reste totalement inchangée par rapport au départ</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 <code>i</code> 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 <code>i</code> premiers éléments sont triés et inférieurs aux suivants</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 <code>i</code> 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 possède un variant qui décroît strictement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un <code>for</code> sur un <code>range</code><br/>
fini termine automatiquement (variant<br/>
implicite). Pour le <code>while</code> du tri par<br/>
insertion, <code>j</code> décroît strictement à<br/>
chaque tour et reste minoré par $0$, donc<br/>
la boucle s'arrête en au plus <code>j</code><br/>
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 de ces deux tris n'utilise de boucle while non bornée</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 toujours de taille finie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai mais pas une justification suffisante :<br/>
une boucle <code>while</code> peut tourner sans fin sur<br/>
une liste finie ; il faut prouver que les<br/>
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 <code>[3, 1, 4, 1, 5]</code> 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/>
<code>liste[i]</code> rejoint à sa bonne place la partie<br/>
déjà triée, formée des éléments d'indices<br/>
$0$ à $i - 1$.</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>[3, 1, 4, 1, 5]</code></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><code>[1, 1, 3, 4, 5]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse. Trace : i=1 → <code>[1, 3, 4, 1, 5]</code> ;<br/>
i=2 → <code>[1, 3, 4, 1, 5]</code> (le 4 ne bouge pas) ;<br/>
i=3 → on insère le 1 (indice 3) à sa place<br/>
: <code>[1, 1, 3, 4, 5]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[1, 3, 4, 1, 5]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'état après i = 2<br/>
(l'élément d'indice 2 a rejoint sa<br/>
place dans la partie triée).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[1, 3, 1, 4, 5]</code></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><code>log n</code></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><code>n - 1</code></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><code>n × (n - 1) / 2</code></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><code>n</code></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, aucun décalage). 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 une quantité importante de mémoire vive</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, le tri coûte plus cher que toutes les recherches</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>Pour utiliser ensuite la recherche dichotomique plutôt que linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tri, quadratique avec la sélection ou<br/>
l'insertion, est un investissement amorti par de nombreuses<br/>
recherches dichotomiques rapides.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre chaque recherche linéaire deux fois plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier ne change pas le coût d'une<br/>
recherche linéaire, qui reste<br/>
proportionnel à la taille. Le bénéfice du<br/>
tri préalable est de rendre la<br/>
<strong>dichotomie</strong> applicable.</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><pre><code>for i in range(1, len(liste) + 1):
    j = i
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:
        liste[j - 1], liste[j] = liste[j], liste[j - 1]
        j -= 1</code></pre><br/>
Pourquoi ce code (tentative de tri par<br/>
insertion) est-il <strong>bogué</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les erreurs de borne d'une unité sont très fréquentes. Il faut<br/>
toujours tester avec des listes simples (<code>[]</code>, <code>[1]</code>, <code>[1, 2]</code>)<br/>
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>Sa complexité est trop élevée pour un tri par insertion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité (quadratique) est<br/>
celle attendue pour un tri par insertion ;<br/>
le problème est ailleurs, dans une borne<br/>
de boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La dernière itération accède à <code>liste[len(liste)]</code>, qui n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est une erreur de borne d'une unité. La borne<br/>
externe est <code>len(liste) + 1</code> au lieu de <code>len(liste)</code> : au dernier<br/>
tour, <code>i = len(liste)</code> puis <code>j = i</code>, et l'accès <code>liste[j]</code> lève une<br/>
<code>IndexError</code>. La forme correcte est <code>range(1, len(liste))</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction <code>range</code> n'accepte pas deux paramètres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe <code>range(début, fin)</code> est<br/>
parfaitement valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il n'y a aucun bug, ce code trie correctement la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code contient bien une<br/>
erreur de borne : la boucle<br/>
va jusqu'à <code>len(liste)</code><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 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 — 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 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 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>Les deux, qui font autant d'échanges au pire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au pire, le tri par sélection fait $n - 1 = 4$ échanges<br/>
alors que le tri par insertion peut en faire<br/>
$\frac{n(n-1)}{2} = 10$. Ils ne se valent pas sur ce critère.</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 des deux, car chacun réécrit toute la liste à chaque passe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun des deux ne réécrit toute la liste à chaque passe.<br/>
La sélection fait un seul échange par passe, ce qui limite les<br/>
écritures à $n - 1 = 4$ échanges.</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 : la sélection fait peu d'échanges (au plus $n - 1$) mais<br/>
toujours autant de comparaisons, quel que soit l'ordre initial.<br/>
L'insertion s'adapte au cas favorable (coût linéaire sur une liste<br/>
triée) mais peut faire beaucoup 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 en coût linéaire sur une liste déjà triée.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : même sur une liste déjà triée, le tri<br/>
par sélection parcourt toute la partie non triée à chaque passe<br/>
pour chercher le minimum. Il fait toujours $\frac{n(n-1)}{2}$<br/>
comparaisons, son coût reste quadratique.</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 pratique : un décalage<br/>
demande une seule écriture, contre deux pour un échange.</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[<pre><code>for i in range(1, len(liste)):
    valeur = liste[i]
    j = i
    while j &gt; 0 and liste[j - 1] &gt; valeur:
        liste[j] = liste[j - 1]
        j -= 1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque la dernière étape<br/>
<code>liste[j] = valeur</code>. 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[<pre><code>for i in range(1, len(liste)):
    valeur = liste[i]
    for j in range(i, 0, -1):
        liste[j] = valeur</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on remplit toutes les positions de<br/>
<code>j = i</code> jusqu'à <code>j = 1</code> 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[<pre><code>for i in range(1, len(liste)):
    valeur = liste[i]
    j = i
    while j &gt; 0 and liste[j - 1] &gt; valeur:
        liste[j] = liste[j - 1]
        j -= 1
    liste[j] = valeur</code></pre>]]></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[<pre><code>for i in range(1, len(liste)):
    j = i
    while j &gt; 0 and liste[j - 1] &gt; liste[j]:
        liste[j] = liste[j - 1]
        j -= 1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on n'a pas sauvegardé la valeur<br/>
d'origine de <code>liste[i]</code> avant de la<br/>
remplacer par <code>liste[j - 1]</code>. 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/>
<code>[5, 3, 8, 1]</code> (n = 4) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Formule à retenir : <code>n(n - 1) / 2</code><br/>
comparaisons pour le tri par sélection, <strong>quel 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 <code>n²</code>, mais le tri par<br/>
sélection fait <code>n(n - 1) / 2</code><br/>
comparaisons, pas <code>n²</code>. 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/>
<code>(n - 1) + (n - 2) + ... + 1 = n(n - 1) / 2</code>,<br/>
soit ici <code>4 × 3 / 2 = 6</code>. Détail : passe 1 → 3 comparaisons ; passe 2 → 2 comparaisons ; passe 3 → 1 comparaison. Total : 6.</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 <code>[3, 1, 4, 2]</code> par tri par<br/>
sélection croissant. Quels sont les états<br/>
successifs de la liste <strong>après chaque 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 <code>pos</code>, (2) l'indice du minimum parmi<br/>
les éléments d'indices <code>pos</code> à <code>n - 1</code>, (3)<br/>
l'échange éventuel. La liste se trie de gauche<br/>
à droite, un élément à la fois. Pour <code>n = 4</code><br/>
éléments, $3$ passes suffisent : une quatrième<br/>
passe, sur un seul élément, serait 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$ : <code>[1, 3, 4, 2]</code>. Après<br/>
passe $2$ : <code>[1, 2, 4, 3]</code>. Après passe<br/>
$3$ : <code>[1, 2, 3, 4]</code></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/>
<code>[3, 1, 4, 2]</code> est $1$ en position<br/>
$1$, on échange → <code>[1, 3, 4, 2]</code>.<br/>
Passe $2$ (position $1$) : minimum de<br/>
<code>[3, 4, 2]</code> est $2$ en position $3$,<br/>
on échange <code>liste[1]</code> avec <code>liste[3]</code><br/>
→ <code>[1, 2, 4, 3]</code>. Passe $3$ (position<br/>
$2$) : minimum de <code>[4, 3]</code> est $3$,<br/>
on échange → <code>[1, 2, 3, 4]</code>. Une éventuelle<br/>
passe $4$, sur le dernier élément seul, ne<br/>
change rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après passe $1$ : <code>[3, 1, 4, 2]</code><br/>
(inchangée). Après passe $2$ :<br/>
<code>[1, 3, 4, 2]</code>. Après passe $3$ :<br/>
<code>[1, 2, 4, 3]</code></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$ : <code>[1, 3, 4, 2]</code>. Après<br/>
passe $2$ : <code>[1, 3, 2, 4]</code>. Après passe<br/>
$3$ : <code>[1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur à la passe $2$ : à partir de la<br/>
position $1$, on cherche le minimum<br/>
parmi <code>[3, 4, 2]</code>, qui est $2$ en<br/>
position $3$. On échange donc<br/>
<code>liste[1]</code> (qui vaut $3$) avec<br/>
<code>liste[3]</code> (qui vaut $2$), ce qui<br/>
donne <code>[1, 2, 4, 3]</code> et non<br/>
<code>[1, 3, 2, 4]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après passe $1$ : <code>[1, 2, 3, 4]</code>. 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 <code>[3, 1, 4, 2]</code> par<br/>
tri par insertion croissant. Quels sont<br/>
les états successifs <strong>après chaque 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 : une itération du tri par<br/>
insertion peut ne presque rien faire quand<br/>
l'élément est déjà bien placé.<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$ : <code>[1, 3, 4, 2]</code>. Après<br/>
$i = 2$ : <code>[1, 3, 4, 2]</code> (inchangée).<br/>
Après $i = 3$ : <code>[1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque itération $i$,<br/>
on prend <code>liste[i]</code> et on l'insère à sa<br/>
place dans la portion déjà triée, formée<br/>
des éléments d'indices $0$ à $i - 1$.<br/>
Pour $i = 1$, le $1$ se place avant le $3$.<br/>
Pour $i = 2$, le 4 est déjà à sa place (rien à faire).<br/>
Pour $i = 3$, le 2 remonte jusqu'à se placer entre 1 et 3, ce qui décale aussi le 3 et le 4 d'un cran.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Après $i = 1$ : <code>[3, 1, 4, 2]</code><br/>
(inchangée). Après $i = 2$ :<br/>
<code>[1, 3, 4, 2]</code>. Après $i = 3$ :<br/>
<code>[1, 3, 4, 2]</code></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 <code>[3]</code>, ce qui le<br/>
place avant le $3$. La liste devient<br/>
donc <code>[1, 3, 4, 2]</code> 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$ : <code>[1, 3, 4, 2]</code>. Après<br/>
$i = 2$ : <code>[1, 2, 3, 4]</code>. Après<br/>
$i = 3$ : <code>[1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à $i = 2$, on insère le $4$,<br/>
pas le $2$. La liste devient <code>[1, 3, 4, 2]</code>,<br/>
pas <code>[1, 2, 3, 4]</code>. 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/>
<code>[1, 3, 4, 2]</code> puis <code>[1, 2, 4, 3]</code> puis <code>[1, 2, 3, 4]</code></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 intermédiaires 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>Quelle <strong>modification du code</strong> d'un tri par<br/>
insertion croissant le transforme en tri<br/>
<strong>décroissant</strong>, sans étape supplémentaire ni<br/>
restriction sur le type des éléments ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette logique se généralise : pour un tri avec un critère<br/>
arbitraire (par âge, par nom, par taille, etc.), on n'a qu'à<br/>
modifier la <strong>comparaison</strong>. Python permet cela via le paramètre<br/>
<code>key=</code> de <code>sorted</code> : avec une fonction clé nommée<br/>
<code>def age(eleve): return eleve[1]</code>, <code>sorted(eleves, key=age)</code> trie<br/>
des couples <code>(nom, age)</code> par âge 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 inverser la liste obtenue avec une boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette approche fonctionne et ne coûte qu'un parcours<br/>
supplémentaire, mais ce n'est pas une modification du tri : c'est<br/>
une étape ajoutée après coup, que l'énoncé exclut. Modifier la<br/>
comparaison interne est plus simple 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 » n'a pas de sens si on n'a pas<br/>
encore de tri, et cette démarche ajoute une étape au lieu de<br/>
modifier le 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<br/>
de la boucle interne (<code>&lt;</code> au lieu<br/>
de <code>&gt;</code>)</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 écrivant<br/>
<code>liste[j - 1] &lt; liste[j]</code> au lieu de<br/>
<code>liste[j - 1] &gt; liste[j]</code>, on trie<br/>
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/>
<code>[3, 1, 3, 2, 3]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tri ne change que l'ordre des éléments : la liste triée contient<br/>
exactement les mêmes valeurs, avec le même nombre d'exemplaires.<br/>
Supprimer les doublons est un autre traitement, qui demande un<br/>
parcours dédié.</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 renvoie <code>[1, 2, 3, 3, 3]</code>,<br/>
tous les doublons étant conservés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les algorithmes de tri fonctionnent parfaitement<br/>
avec des doublons. Ils réordonnent les éléments sans en retirer ni<br/>
en ajouter : les trois <code>3</code> se retrouvent côte à côte en fin de<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les doublons sont supprimés et le<br/>
tri renvoie <code>[1, 2, 3]</code></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 un parcours qui n'ajoute chaque<br/>
valeur à une nouvelle liste que si elle<br/>
n'y est pas déjà).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les comparaisons d'éléments égaux<br/>
font boucler l'algorithme sans fin</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, les<br/>
éléments égaux étant incomparables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : deux valeurs égales sont<br/>
parfaitement comparables. Les<br/>
algorithmes de tri sont conçus pour<br/>
fonctionner avec n'importe quelle<br/>
suite de valeurs comparables,<br/>
doublons compris.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q33 : Après le premier passage du tri par sélection</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le tri par sélection cherche le minimum de la liste et l'échange<br/>
avec le premier élément, puis recommence sur le reste. Que devient<br/>
la liste <code>[5, 2, 9, 1, 7]</code> après le premier passage ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chaque passage du tri par sélection place un élément à sa position<br/>
définitive, par un seul échange.</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><code>[1, 2, 9, 5, 7]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le minimum est échangé avec l'élément en<br/>
position 0 ; le reste de la liste n'est pas réordonné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[1, 2, 5, 9, 7]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul échange a lieu par passage, le reste de la<br/>
liste garde son ordre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[2, 5, 9, 1, 7]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le minimum qui est placé en tête, pas un autre<br/>
élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[1, 2, 5, 7, 9]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste entièrement triée n'est obtenue qu'après tous<br/>
les passages.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q34 : Le tri par sélection sur une liste déjà triée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On applique le tri par sélection à une liste de $n$ éléments déjà<br/>
triée. Que peut-on dire du nombre de comparaisons effectuées ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le tri par sélection a un coût indépendant des données ; le tri<br/>
par insertion, lui, profite d'une liste presque triée.</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 même que pour toute liste de $n$ éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tri par sélection cherche le minimum du reste<br/>
à chaque passage, quel que soit l'ordre initial. Il ne tire<br/>
aucun parti d'une liste déjà triée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il tombe à $n - 1$, chaque élément étant déjà à sa place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le tri par insertion qui se contente de $n - 1$<br/>
comparaisons sur une liste triée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il est nul, aucun échange n'étant nécessaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les échanges sont inutiles, mais les comparaisons pour<br/>
trouver chaque minimum ont bien lieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il double, la liste devant être vérifiée deux fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien n'est vérifié deux fois ; le coût est simplement<br/>
inchangé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q35 : La partie déjà triée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après $k$ passages du tri par sélection sur une liste, quelle partie<br/>
de la liste est garantie triée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'invariant du tri par sélection : à chaque instant, la partie<br/>
gauche est triée et contient les plus petits éléments.</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>Les $k$ premiers éléments, à leur position définitive</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque passage place le minimum du reste juste<br/>
après la partie triée. Les $k$ premiers éléments sont les $k$<br/>
plus petits, dans l'ordre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les $k$ derniers éléments, les plus grands</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri par sélection construit la partie triée par la<br/>
gauche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toute la liste, dès le premier passage terminé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un passage ne place qu'un seul élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune partie, le tri ne s'achevant qu'au dernier passage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la partie gauche est triée et définitive dès les<br/>
premiers passages, c'est l'invariant du tri.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q36 : Après l'insertion du troisième élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le tri par insertion insère chaque élément, de gauche à droite, à<br/>
sa place dans la partie déjà triée qui le précède. Que devient la<br/>
liste <code>[4, 7, 2, 9]</code> juste après l'insertion de son troisième élément ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>À chaque étape du tri par insertion, la partie gauche reste triée<br/>
et grandit d'un élément.</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><code>[2, 4, 7, 9]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux premiers éléments forment la partie<br/>
triée ; le troisième y est inséré à sa place, et le dernier<br/>
élément n'a pas encore été traité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[2, 4, 7, 9, 2]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le quatrième élément n'est inséré qu'au passage<br/>
suivant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[4, 2, 7, 9]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'élément est inséré à sa place dans la partie triée,<br/>
pas simplement échangé avec son voisin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[2, 7, 4, 9]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la partie triée doit rester triée après l'insertion.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q37 : Le nombre de décalages d'une insertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La partie triée vaut <code>[5, 8, 9]</code> et l'élément à insérer vaut <code>6</code>.<br/>
Le tri par insertion décale vers la droite chaque élément plus<br/>
grand que <code>6</code>, puis le place. Combien de décalages sont<br/>
effectués ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le coût d'une insertion est le nombre d'éléments plus grands que la<br/>
valeur insérée : nul si elle est la plus grande, maximal si elle<br/>
est la plus petite.</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><code>2</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : seuls les éléments strictement plus grands que<br/>
6 sont décalés d'un cran, et 6 prend la position 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 1 est la position finale de 6, pas le nombre<br/>
d'éléments déplacés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3 est le nombre d'éléments de la partie triée ;<br/>
seuls ceux qui dépassent 6 sont décalés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 4 est la taille de la partie triée après<br/>
l'insertion, pas le nombre d'éléments déplacés.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q38 : Classer une main de cartes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un joueur prend ses cartes une par une et glisse chacune à sa place<br/>
parmi celles qu'il tient déjà, rangées dans l'ordre. Quel tri<br/>
reproduit-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le tri par insertion est celui que l'on pratique naturellement avec<br/>
des cartes ou des copies à classer.</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 par insertion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la main déjà rangée est la partie triée, et<br/>
chaque nouvelle carte y est insérée à sa place.</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 : le tri par sélection chercherait d'abord la plus petite<br/>
carte de toutes, puis la suivante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La recherche dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie cherche une valeur, elle ne range pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun tri, l'ordre venant de la distribution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les cartes arrivent dans un ordre quelconque ; c'est<br/>
le joueur qui les trie.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q39 : Trier des chaînes de caractères</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie <code>sorted(["pomme", "Banane", "cerise"])</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trier des chaînes suit l'ordre des codes de caractères : pour un<br/>
ordre alphabétique insensible à la casse, on trie sur les<br/>
minuscules.</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><code>['Banane', 'cerise', 'pomme']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les chaînes se comparent par les codes de leurs<br/>
caractères, et toutes les majuscules précèdent les minuscules.<br/>
<code>'B'</code> passe donc avant <code>'c'</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>['Banane', 'pomme', 'cerise']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : entre <code>'cerise'</code> et <code>'pomme'</code>, <code>'c'</code> précède <code>'p'</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>['cerise', 'pomme', 'Banane']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la majuscule <code>'B'</code> a un code plus petit que les<br/>
minuscules, elle vient en premier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>['pomme', 'Banane', 'cerise']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sorted</code> renvoie une liste triée, pas l'ordre initial.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tris par sélection et par insertion — Q40 : Deux fois plus d'éléments à trier</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un tri par insertion met $1$ s pour trier dix mille d'éléments dans le<br/>
pire cas. Combien de temps met-il, toujours dans le pire cas, pour<br/>
vingt mille d'éléments ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour un coût en $n^2$, multiplier $n$ par $2$ multiplie le temps par<br/>
$4$ : c'est ce qui rend ces tris inutilisables sur de très grandes<br/>
listes.</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 $4$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le coût est quadratique. Doubler la taille<br/>
multiplie le nombre de comparaisons par quatre, donc le temps<br/>
aussi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ $2$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un temps doublé correspondrait à un coût linéaire ; le<br/>
tri par insertion est quadratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ $8$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un facteur huit correspondrait à un coût cubique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours $1$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le temps dépend fortement de la taille de la liste.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
