<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Diviser pour régner</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Paradigme diviser pour régner (étapes diviser, régner, combiner),<br/>
recherche dichotomique, tri fusion et tri rapide, exponentiation<br/>
rapide, complexité par récurrence et théorème maître.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q01 : Étapes du paradigme diviser pour régner</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelles sont les <strong>trois étapes</strong> du paradigme diviser pour<br/>
régner ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le paradigme repose sur l'idée que résoudre un sous-problème<br/>
plus petit est plus simple, et que combiner les solutions<br/>
partielles donne efficacement la solution complète. C'est<br/>
l'idée mère de la recherche dichotomique, du tri fusion, de<br/>
l'exponentiation rapide, 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>Initialiser, itérer, terminer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces étapes décrivent une boucle, pas le paradigme<br/>
diviser pour régner qui est typiquement récursif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Diviser, régner, combiner</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on divise le problème en sous-problèmes<br/>
plus petits, on les résout (récursivement), puis on<br/>
combine les solutions partielles pour obtenir la solution<br/>
du problème initial.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier, fusionner, comparer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces opérations apparaissent dans le tri fusion<br/>
(un cas particulier), mais ne sont pas les trois étapes<br/>
générales du paradigme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Identifier, calculer, vérifier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces verbes décrivent une démarche scientifique<br/>
générale, pas la stratégie diviser pour régner.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q02 : Complexité de la recherche dichotomique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité au pire de la recherche dichotomique<br/>
sur un tableau trié de $n$ éléments ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour $n = 10^9$, la dichotomie effectue au plus $30$<br/>
comparaisons. C'est l'un des gains algorithmiques les plus<br/>
spectaculaires : passer de linéaire à logarithmique.</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>$O(\log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque étape, l'intervalle de recherche<br/>
est divisé par deux. Le nombre d'étapes est donc le<br/>
logarithme en base $2$ de $n$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n \log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la complexité du tri fusion, pas d'une<br/>
recherche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la complexité de la recherche <strong>linéaire</strong>.<br/>
La dichotomie est plus rapide grâce au tri préalable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(1)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une recherche en temps constant, ce<br/>
qui n'est pas réaliste pour rechercher un élément dans<br/>
un tableau de taille variable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q03 : Principe du tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe du <strong>tri fusion</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le tri fusion est l'archétype du tri par diviser pour régner.<br/>
Sa complexité $O(n \log n)$ ne dépend pas de l'ordre initial,<br/>
ce qui en fait un tri à comportement <strong>prévisible</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="0" format="html">
    <text><![CDATA[<p>Chercher le plus petit élément, le placer en début, recommencer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le principe du tri par sélection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Couper le tableau en deux moitiés, trier chaque moitié récursivement, puis fusionner les deux moitiés triées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'application directe du paradigme<br/>
diviser pour régner. La fusion de deux tableaux triés<br/>
se fait en temps linéaire en parcourant les deux<br/>
simultanément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Insérer chaque élément à sa place dans la portion déjà triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le principe du tri par insertion.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comparer chaque paire d'éléments adjacents et les permuter si nécessaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le principe du tri à bulles, en $O(n^2)$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q04 : Complexité du tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité du tri fusion sur un tableau de $n$<br/>
éléments ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le tri fusion est <strong>stable</strong> (préserve l'ordre des éléments<br/>
égaux) et a une complexité <strong>garantie</strong> $O(n \log n)$ dans<br/>
tous les cas, ce qui le rend prédictible. Son inconvénient<br/>
principal : il n'est <strong>pas en place</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>$O(n \log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il y a $\log n$ niveaux de récursion (on<br/>
divise par deux à chaque niveau). À chaque niveau, on<br/>
parcourt l'ensemble des $n$ éléments lors des fusions.<br/>
Total : $n \log n$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n^2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la complexité des tris naïfs (sélection,<br/>
insertion, bulles). Le tri fusion est meilleur grâce au<br/>
paradigme DPR.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(2^n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri usuel n'est exponentiel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fusion seule est en $O(n)$, mais on la<br/>
répète sur $\log n$ niveaux de récursion, ce qui donne<br/>
$O(n \log n)$ au total.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q05 : Cas de base du tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>cas de base</strong> du tri fusion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir un cas de base à $0$ ou $1$ élément simplifie le<br/>
code : on n'a même pas besoin de gérer la division pour ces<br/>
cas. Cela rend la fonction parfaitement récursive.</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>Un tableau de deux éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tableau de deux éléments peut être mal<br/>
trié. Il faut soit le diviser à nouveau, soit le trier<br/>
directement (cas particulier optimisé).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tableau trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne sait pas a priori si le tableau est trié<br/>
(sans le parcourir). Le cas de base du tri fusion est<br/>
basé sur la <strong>taille</strong>, pas sur l'ordre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tableau de longueur paire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la parité ne garantit pas qu'un tableau soit<br/>
trié. Le tri fusion fonctionne pour toute parité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un tableau de zéro ou un élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un tableau vide ou de longueur $1$ est<br/>
déjà trié par définition. La récursion s'arrête à ce<br/>
niveau, sans nouvelle découpe ni fusion.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q06 : Principe de l'exponentiation rapide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'<strong>exponentiation rapide</strong> calcule $a^n$ en exploitant<br/>
quelle propriété mathématique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour calculer $a^{20}$ : la méthode naïve fait $19$<br/>
multiplications, l'exponentiation rapide en fait environ<br/>
$\log_2(20) \approx 5$. Le gain devient énorme pour de<br/>
grands exposants (cryptographie, arithmétique modulaire).</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>$a^n = a^{n-1} \cdot a$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la définition récursive <strong>naïve</strong> de la<br/>
puissance, en $O(n)$. L'exponentiation rapide va beaucoup<br/>
plus vite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$a^n = a + a + \cdots + a$ ($n$ fois)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la définition de la multiplication, pas<br/>
de la puissance. L'exponentiation rapide ne peut pas<br/>
partir d'une somme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$a^n = (a^{n/2})^2$ si $n$ est pair, et $a^n = a \cdot (a^{(n-1)/2})^2$ si $n$ est impair</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on divise l'exposant par deux à chaque<br/>
étape (au lieu de soustraire $1$). Cela amène la<br/>
complexité de $O(n)$ à $O(\log n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$a^n = n \cdot a$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la définition de $n \cdot a$, pas de $a^n$.<br/>
Confusion entre puissance et produit.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q07 : Tri fusion en place ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le tri fusion est-il un tri <strong>en place</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tris en place : par sélection, par insertion, à bulles, tri<br/>
rapide. Tri <strong>non en place</strong> : tri fusion (mémoire<br/>
$O(n)$). Pour de grandes données, cet inconvénient peut<br/>
faire préférer le tri rapide.</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>Oui, il modifie le tableau d'origine sans mémoire supplémentaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri fusion utilise des tableaux auxiliaires<br/>
(les moitiés gauche et droite, puis le résultat fusionné).<br/>
Sa mémoire supplémentaire est en $O(n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, il utilise une mémoire supplémentaire proportionnelle à $n$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque niveau de récursion, on crée des<br/>
tableaux pour les moitiés et la fusion. C'est l'un des<br/>
inconvénients du tri fusion, contrairement au tri rapide<br/>
ou au tri par insertion.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement pour des listes de taille paire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la parité n'a aucune influence sur le caractère<br/>
en place ou non.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, mais il utilise une mémoire constante</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoire supplémentaire n'est pas constante,<br/>
elle est proportionnelle à la taille du tableau.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q08 : Pré-requis de la recherche dichotomique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la condition <strong>indispensable</strong> pour appliquer la<br/>
recherche dichotomique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Si la liste n'est pas triée et que les recherches sont<br/>
occasionnelles, mieux vaut faire une recherche linéaire<br/>
qu'un tri préalable. La dichotomie est rentable quand on<br/>
prévoit de très nombreuses recherches sur la même liste.</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 tableau doit être trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dichotomie compare l'élément cherché<br/>
au milieu pour décider d'aller à gauche ou à droite. Si<br/>
le tableau n'est pas trié, cette comparaison ne donne<br/>
aucune information utile, et l'algorithme peut renvoyer<br/>
un faux négatif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tableau doit être de taille puissance de $2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la taille n'a pas besoin d'être une puissance<br/>
de $2$. La dichotomie fonctionne pour toute taille<br/>
$\geq 0$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tableau doit avoir une taille connue à l'avance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une caractéristique des tableaux Python<br/>
ou C en général, pas une contrainte de la dichotomie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tableau doit contenir uniquement des entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie fonctionne sur tout type<br/>
comparable (entiers, flottants, chaînes, dates, etc.).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q09 : Récursivité et diviser pour régner</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi le paradigme diviser pour régner s'implémente-t-il<br/>
naturellement par <strong>récursivité</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Certains algorithmes DPR ont des versions itératives plus<br/>
efficaces (recherche dichotomique itérative, exponentiation<br/>
rapide itérative), mais la version récursive est souvent<br/>
plus claire pédagogiquement.</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 la récursivité est le seul moyen de coder une boucle en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python permet aussi des boucles <code>for</code> et<br/>
<code>while</code>. La récursivité est un choix, pas une<br/>
obligation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le paradigme nécessite la mémoïsation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoïsation concerne la programmation<br/>
dynamique, pas le diviser pour régner classique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la récursivité est plus rapide que l'itération</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la récursivité est en réalité souvent un peu<br/>
<strong>plus lente</strong> (surcoût des appels) en Python. Son<br/>
intérêt est la lisibilité, pas la vitesse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'on doit résoudre des sous-problèmes de même nature que le problème initial, ce qui s'exprime naturellement par un appel récursif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la définition même du paradigme implique<br/>
que les sous-problèmes sont de même structure que le<br/>
problème principal. Une fonction qui s'appelle<br/>
elle-même sur le sous-problème est l'expression la plus<br/>
directe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q10 : Fusion de deux listes triées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour fusionner deux listes <strong>déjà triées</strong> de longueur $n$<br/>
chacune en une seule liste triée, quelle est la complexité<br/>
de l'opération ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est précisément cette fusion en $O(n)$ par niveau, répétée<br/>
sur $\log n$ niveaux, qui donne la complexité globale en<br/>
$O(n \log n)$ du tri fusion.</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>$O(n^2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on n'a pas besoin de comparer chaque élément à<br/>
tous les autres, seulement aux candidats en tête de<br/>
chaque liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n \log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la complexité du tri fusion <strong>complet</strong>,<br/>
pas de la seule fusion. La fusion est l'étape<br/>
« combiner » du paradigme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on parcourt les deux listes<br/>
simultanément avec un index pour chacune. Chaque<br/>
comparaison fait avancer l'un des deux index. Au total,<br/>
on fait $2n$ pas, soit $O(n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(1)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faut quand même parcourir les éléments des<br/>
deux listes au moins une fois pour les disposer dans<br/>
l'ordre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q11 : Nombre de comparaisons en dichotomie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien de comparaisons effectue <strong>au pire</strong> une recherche<br/>
dichotomique sur un tableau de $1\ 000$ éléments ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Repère utile : doubler la taille n'ajoute qu'<strong>une</strong><br/>
comparaison. Pour passer de $1\ 000$ à $2\ 000$, on passe de<br/>
$10$ à $11$ comparaisons. C'est ce qui rend les algorithmes<br/>
logarithmiques exceptionnellement rapides à grande échelle.</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$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne peut pas garantir une seule comparaison<br/>
dans le pire cas. Le pire cas atteint $\lceil \log_2 n \rceil$<br/>
comparaisons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$500$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la première étape de la dichotomie élimine la<br/>
moitié des candidats, mais on continue à diviser<br/>
ensuite. Le total est bien plus faible que $500$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1\ 000$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le nombre maximal de comparaisons d'une<br/>
recherche <strong>linéaire</strong>. La dichotomie est bien plus<br/>
rapide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ $10$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : $\log_2(1\ 000) \approx 9{,}97$. Au<br/>
pire, $10$ comparaisons suffisent pour trouver l'élément<br/>
ou conclure à son absence.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q12 : Tri fusion sur un exemple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si l'on applique le tri fusion à la liste $[5, 2, 8, 3, 9, 1]$,<br/>
quelle est la première étape ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Après division récursive, on obtient des sous-listes de<br/>
taille $1$ (déjà triées). Puis les fusions remontent en<br/>
reconstituant des sous-listes triées de plus en plus<br/>
grandes : $[2, 5]$, $[2, 5, 8]$, etc. jusqu'au tableau<br/>
complet 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>Diviser la liste en $[5, 2, 8]$ et $[3, 9, 1]$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on coupe la liste au milieu en deux<br/>
sous-listes de taille (presque) égale. Chaque moitié<br/>
sera triée récursivement avant la fusion finale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trouver le plus petit élément ($1$) et le placer en début</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le tri par sélection. Le tri fusion ne<br/>
cherche pas le minimum, il découpe la liste en deux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier la liste avec une fonction <code>sorted</code> intégrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : utiliser <code>sorted</code> éviterait l'algorithme<br/>
étudié. La question porte sur le déroulement du tri<br/>
fusion lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comparer $5$ et $2$, les permuter</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'opération du tri à bulles. Le tri<br/>
fusion ne fait pas de comparaisons adjacentes au début.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q13 : Complexité de l'exponentiation rapide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de l'exponentiation rapide pour<br/>
calculer $a^n$ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour $n = 10^{18}$, la méthode naïve ferait $10^{18} - 1$<br/>
multiplications (impossible). L'exponentiation rapide n'en<br/>
fait qu'une soixantaine. Indispensable en cryptographie<br/>
asymétrique (RSA).</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>$O(1)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité dépend bien de $n$. Pour $n$<br/>
très grand, le calcul nécessite plusieurs étapes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la complexité de la méthode <strong>naïve</strong><br/>
($a^n = a \cdot a^{n-1}$, $n - 1$ multiplications).<br/>
L'exponentiation rapide divise par deux au lieu de<br/>
décrémenter de $1$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$O(\log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque appel récursif, on divise<br/>
l'exposant par deux. Il y a donc environ $\log_2 n$<br/>
niveaux d'appels, donc autant de multiplications.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n^2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune raison d'avoir une complexité quadratique<br/>
pour ce calcul.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q14 : Récurrence du tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit $T(n)$ le nombre d'opérations du tri fusion sur un<br/>
tableau de $n$ éléments. Quelle relation de récurrence<br/>
vérifie $T(n)$ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette récurrence est l'archétype du « théorème maître » en<br/>
analyse de complexité : elle apparaît dans tous les<br/>
algorithmes DPR qui divisent en deux et combinent en<br/>
$O(n)$.</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>$T(n) = T(n/2) + 1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la récurrence de la <strong>dichotomie</strong> (un<br/>
seul appel récursif sur la moitié). Le tri fusion en<br/>
fait deux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$T(n) = T(n-1) + 1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette récurrence donne $T(n) = O(n)$, ce qui<br/>
est trop optimiste pour le tri fusion.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$T(n) = 2 \cdot T(n/2) + n$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on appelle deux fois la fonction sur des<br/>
moitiés (les $2 \cdot T(n/2)$), puis on fusionne en<br/>
$O(n)$ opérations. Le théorème maître donne<br/>
$T(n) = O(n \log n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$T(n) = T(n-1) + T(n-2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la récurrence de Fibonacci. Le tri<br/>
fusion ne dépend pas des deux étapes précédentes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q15 : Stabilité du tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le tri fusion est-il un tri <strong>stable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La stabilité importe quand on trie des données déjà triées<br/>
par un autre critère. Par exemple, trier des étudiants par<br/>
moyenne après les avoir triés par nom : un tri stable<br/>
conserve l'ordre alphabétique parmi les ex-aequo.</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>Oui, à condition d'utiliser <code>&lt;=</code> plutôt que <code>&lt;</code> dans la fonction de fusion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tri fusion est stable si la fusion<br/>
choisit l'élément de gauche en cas d'égalité. Cela<br/>
préserve l'ordre relatif des éléments égaux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La notion de stabilité ne s'applique qu'aux tris itératifs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la stabilité est une notion qui s'applique à<br/>
tout tri, indépendamment de son implémentation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela dépend de la taille de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la stabilité d'un algorithme ne dépend pas de<br/>
la taille de l'entrée, mais de sa structure.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, le tri fusion ne préserve pas l'ordre des éléments égaux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il l'est, à condition d'écrire correctement la<br/>
fonction de fusion.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q16 : Tri fusion vs tri par insertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trier un tableau de $1\ 000\ 000$ éléments, le tri<br/>
fusion ($O(n \log n)$) est environ combien de fois plus<br/>
rapide que le tri par insertion ($O(n^2)$) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette différence d'ordre de grandeur explique pourquoi le<br/>
choix de l'algorithme est crucial. Sur petites entrées, les<br/>
tris simples sont compétitifs ; sur grandes entrées, les<br/>
tris en $O(n \log n)$ deviennent indispensables.</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 $50\ 000$ fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour $n = 10^6$, $n^2 = 10^{12}$ et<br/>
$n \log_2 n \approx 2 \cdot 10^7$. Le rapport est<br/>
environ $50\ 000$. C'est la différence entre une seconde<br/>
et $14$ heures sur la même machine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1\ 000\ 000$ fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le rapport $n^2 / n = n$, mais on<br/>
divise par $n \log n$, pas par $n$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$2$ fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est bien plus grande. $\log_2 n$<br/>
n'est qu'une fraction de $n$ pour de grandes valeurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$10$ fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est de plusieurs ordres de<br/>
grandeur, pas un seul facteur $10$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q17 : Optimisation par mémoïsation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une implémentation <strong>récursive</strong> d'exponentiation<br/>
rapide, est-il utile d'ajouter de la <strong>mémoïsation</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La distinction est cruciale : le diviser pour régner peut<br/>
avoir des sous-problèmes redondants (cas de Fibonacci) ou<br/>
uniques (cas de l'exponentiation rapide). Seul le premier<br/>
bénéficie de la mémoïsation.</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>Oui, cela accélère le calcul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à chaque appel, on calcule une seule valeur<br/>
intermédiaire (<code>demi = puissance(a, n // 2)</code>), pas la<br/>
même plusieurs fois. La mémoïsation n'apporterait rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, l'exponentiation rapide ne fait pas d'appels redondants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque appel, le sous-problème est<br/>
unique (un seul exposant intermédiaire est calculé). Il<br/>
n'y a donc aucun calcul redondant, contrairement à<br/>
Fibonacci naïf.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement pour des exposants pairs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoïsation n'est utile que s'il y a des<br/>
appels redondants, ce qui n'est pas le cas ici.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela rendrait l'algorithme plus lent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoïsation seule ne ralentit pas<br/>
significativement, mais l'avantage est nul ici.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q18 : Détection d'une erreur dans la dichotomie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans la fonction suivante :</p>
<pre><code>def recherche(x, tab):
    gauche, droite = 0, len(tab) - 1
    while gauche &lt; droite:        # ← ICI
        milieu = (gauche + droite) // 2
        if tab[milieu] == x:
            return milieu
        elif tab[milieu] &lt; x:
            gauche = milieu + 1
        else:
            droite = milieu - 1
    return -1</code></pre>
<p>Quel est le bug ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Erreur subtile et classique. Test concret : avec<br/>
<code>tab = [5]</code> et <code>x = 5</code>, on a <code>gauche = droite = 0</code>, la<br/>
condition <code>gauche &lt; droite</code> est fausse, on sort<br/>
immédiatement et on renvoie $-1$ alors que $x$ est présent.</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>Il manque l'initialisation de <code>milieu</code> avant la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>milieu</code> est défini à l'intérieur de la boucle,<br/>
ce qui est la convention habituelle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La condition de boucle devrait être <code>gauche &lt;= droite</code> (avec <code>&lt;=</code> au lieu de <code>&lt;</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec <code>&lt;</code> strict, on n'examine pas le<br/>
dernier élément quand <code>gauche == droite</code>. La fonction<br/>
peut renvoyer $-1$ pour un élément qui est en réalité<br/>
présent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le calcul de <code>milieu</code> est incorrect</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le calcul <code>(gauche + droite) // 2</code> est<br/>
standard et correct. Le bug est ailleurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction devrait être récursive pour fonctionner</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie peut s'écrire en itératif comme<br/>
en récursif. La forme itérative est même souvent<br/>
préférée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q19 : Tri rapide vs tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la principale différence entre le <strong>tri rapide</strong><br/>
(<em>quicksort</em>) et le tri fusion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir entre les deux dépend du contexte : tri rapide pour<br/>
gagner de la mémoire (et accepter le risque du pire cas),<br/>
tri fusion pour la prévisibilité. Les bibliothèques<br/>
standard utilisent souvent des tris hybrides comme<br/>
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>Le tri rapide est toujours plus rapide que le tri fusion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas systématique. Sur certaines<br/>
entrées (déjà triées avec mauvais pivot), il est même<br/>
beaucoup plus lent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tri rapide est en place mais sa complexité au pire est $O(n^2)$, alors que le tri fusion est $O(n \log n)$ garanti mais pas en place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tri rapide partitionne autour d'un<br/>
pivot et est en place, mais avec un mauvais pivot, il<br/>
dégénère à $O(n^2)$. Le tri fusion garantit<br/>
$O(n \log n)$ mais utilise plus de mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri rapide est plus simple à comprendre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces deux algorithmes ont une difficulté<br/>
comparable. Ce n'est pas la raison de leur distinction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri rapide ne fonctionne que sur les entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux fonctionnent sur tout type comparable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q20 : Découpage déséquilibré</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que se passe-t-il si le découpage en sous-problèmes est très<br/>
<strong>déséquilibré</strong> (par exemple, une moitié contenant $1$<br/>
élément et l'autre $n-1$ éléments) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est pour cette raison que le choix du <strong>pivot</strong> est<br/>
crucial dans le tri rapide. Des stratégies sont utilisées<br/>
(médian de trois, pivot aléatoire) pour éviter les pires<br/>
cas pratiques.</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é reste $O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un découpage déséquilibré ne réduit pas la<br/>
taille suffisamment vite pour rester en $O(n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La complexité reste en $O(n \log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité $O(n \log n)$ suppose un<br/>
découpage <strong>équilibré</strong> (en deux moitiés de même taille).<br/>
Un découpage déséquilibré dégrade fortement la<br/>
performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La complexité dégénère à $O(n^2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec ce découpage, on a $n$ niveaux de<br/>
récursion (au lieu de $\log n$), chacun coûtant $O(n)$.<br/>
Le total devient $O(n^2)$. C'est exactement ce qui se<br/>
produit avec un mauvais pivot dans le tri rapide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme ne termine pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tant que le découpage diminue strictement la<br/>
taille du sous-problème, l'algorithme termine. Le<br/>
problème est la <strong>performance</strong>, pas la terminaison.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q21 : Application du théorème maître</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit la récurrence $T(n) = 4 \cdot T(n/2) + n$. Quelle est la<br/>
complexité asymptotique de $T(n)$ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le théorème maître donne $T(n) = O(n^{\log_b a})$ pour la<br/>
récurrence $T(n) = a T(n/b) + O(n^c)$ quand $\log_b a &gt; c$.<br/>
Ici $a = 4$, $b = 2$, $c = 1$ : on a $\log_2 4 = 2 &gt; 1$,<br/>
donc $O(n^2)$.</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>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec $4$ sous-problèmes de taille $n/2$ chacun,<br/>
la complexité dépasse $O(n)$. À chaque niveau on<br/>
quadruple le nombre d'appels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n^4)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : $4^{\log_2 n} = n^{\log_2 4} = n^2$, pas $n^4$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n \log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le résultat pour $T(n) = 2 T(n/2) + n$,<br/>
pas $4 T(n/2) + n$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$O(n^2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec $4$ appels sur des moitiés, on a un<br/>
arbre d'appels qui croît comme $4^{\log_2 n} = n^2$.<br/>
C'est en effet la complexité du tri par sélection<br/>
version DPR sans optimisation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q22 : Profondeur de la pile en tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trier un tableau de $1\ 000$ éléments par tri fusion<br/>
récursif, quelle est la <strong>profondeur maximale</strong> de la pile<br/>
d'appels ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est une autre force du diviser pour régner avec<br/>
découpage équilibré : la profondeur logarithmique évite<br/>
tout problème de débordement de pile, même pour des<br/>
milliards d'é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="0" format="html">
    <text><![CDATA[<p>$500$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion possible avec « la moitié ». La<br/>
profondeur n'est pas $n/2$ mais bien $\log n$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ $10$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : $\log_2(1\ 000) \approx 10$. La pile<br/>
d'appels reste donc très peu profonde, ce qui évite<br/>
les <code>RecursionError</code> même pour de grandes entrées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul appel ne suffit pas à diviser<br/>
$1\ 000$ éléments jusqu'au cas de base.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1\ 000$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne descend pas $1\ 000$ niveaux. Le<br/>
découpage divise par deux à chaque niveau, donc la<br/>
profondeur croît comme $\log n$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q23 : Exponentiation modulaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour calculer $a^n \mod m$ avec de très grands entiers<br/>
(cryptographie), la méthode efficace est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'exponentiation modulaire rapide est l'opération<br/>
fondamentale du chiffrement RSA. Elle permet de calculer<br/>
$a^n \mod m$ pour des entiers de plusieurs milliers de<br/>
bits, en quelques millisecondes.</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>Appliquer l'exponentiation rapide en réduisant modulo $m$ à chaque multiplication</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : $(a \cdot b) \mod m = ((a \mod m) \cdot (b \mod m)) \mod m$,<br/>
donc on peut réduire à chaque étape sans changer le<br/>
résultat final. Cela maintient les entiers<br/>
intermédiaires petits ($&lt; m^2$), tout en bénéficiant<br/>
de la complexité $O(\log n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Calculer $a^n$ entièrement, puis prendre le modulo</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour $a = 1024$ et $n = 10^9$, $a^n$ a plus<br/>
d'un milliard de chiffres et n'est pas calculable en<br/>
pratique. Il faut prendre le modulo à chaque étape.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser une recherche dichotomique sur les diviseurs de $m$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche dichotomique n'a aucun rapport<br/>
avec ce calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser le tri fusion sur les chiffres décimaux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport entre tri et exponentiation<br/>
modulaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q24 : Analyse d'un nouvel algorithme DPR</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On invente un algorithme qui, pour un tableau de $n$<br/>
éléments, le découpe en <strong>trois tiers</strong>, traite chaque tiers<br/>
récursivement, puis fait un travail $O(n)$ pour combiner.<br/>
Quelle est sa complexité ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En général, $a$ sous-problèmes de taille $n/b$ avec une<br/>
combinaison en $O(n)$ donne $O(n \log n)$ tant que<br/>
$\log_b a = 1$. C'est la « zone d'équilibre » du théorème<br/>
maître.</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>$O(n^3)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on découpe en trois, mais chaque sous-problème<br/>
fait $1/3$ de la taille originale, pas $n/2$. Le<br/>
résultat reste $O(n \log n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la combinaison à elle seule est en $O(n)$, mais<br/>
il y a aussi $\log_3 n$ niveaux à parcourir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(3^n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité exponentielle apparaît avec des<br/>
appels qui ne réduisent pas la taille. Ici, on divise<br/>
la taille à chaque étape.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$O(n \log_3 n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la récurrence est<br/>
$T(n) = 3 T(n/3) + O(n)$. Le théorème maître donne<br/>
$T(n) = O(n \log n)$ (le facteur $\log_3$ étant<br/>
équivalent à $\log_2$ à une constante près).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q25 : Reconnaître un algorithme DPR</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les algorithmes suivants, lequel <strong>n'est pas</strong> un<br/>
algorithme diviser pour régner ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour identifier un DPR, chercher : (1) un découpage en<br/>
sous-problèmes plus petits de même nature, (2) une<br/>
résolution récursive, (3) une étape de combinaison. Le tri<br/>
par insertion ne fait pas de découpage récursif, donc ce<br/>
n'est pas un DPR.</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 : le tri par insertion ne divise pas le<br/>
problème. Il itère sur les éléments et place chacun à<br/>
sa place dans la portion déjà triée. C'est un<br/>
algorithme <strong>itératif</strong> classique, pas un DPR.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'exponentiation rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un DPR. On réduit l'exposant de moitié<br/>
à chaque appel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La recherche dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est aussi un DPR. On divise l'intervalle de<br/>
recherche par deux à chaque étape.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tri fusion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un cas d'école du paradigme. On découpe<br/>
en deux moitiés, on trie chaque moitié récursivement,<br/>
on fusionne.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q26 : Code de l'exponentiation rapide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code Python implémente correctement<br/>
l'exponentiation rapide récursive de $a$ à la<br/>
puissance $n$ (avec $n \geq 0$) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Idée centrale : sauvegarder le résultat de<br/>
<code>puissance(a, n // 2)</code> dans une variable. Sans cette<br/>
mémorisation, l'algorithme dégénère en<br/>
exponentiation naïve. C'est l'illustration la plus<br/>
simple du diviser pour régner sur un seul<br/>
sous-problème.</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>def puissance(a, n):
    if n == 0:
        return 1
    if n % 2 == 0:
        return puissance(a, n // 2) * puissance(a, n // 2)
    return a * puissance(a, n // 2) * puissance(a, n // 2)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on calcule <strong>deux fois</strong> la même puissance<br/>
au lieu de la stocker dans une variable. La<br/>
complexité retombe à $O(n)$, ce qui annule l'avantage<br/>
de l'exponentiation rapide. Bug classique du<br/>
débutant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def puissance(a, n):
    if n == 0:
        return 1
    return a * puissance(a, n - 1)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'exponentiation <strong>naïve</strong>, en<br/>
$O(n)$ multiplications. Elle décrémente l'exposant<br/>
de $1$ à chaque étape au lieu de le diviser par<br/>
deux. La question demandait l'exponentiation<br/>
<strong>rapide</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def puissance(a, n):
    return a ** n</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on utilise l'opérateur Python intégré, ce<br/>
qui n'illustre pas le paradigme étudié. La question<br/>
portait sur l'écriture <strong>explicite</strong> de<br/>
l'exponentiation rapide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def puissance(a, n):
    if n == 0:
        return 1
    demi = puissance(a, n // 2)
    if n % 2 == 0:
        return demi * demi
    return a * demi * demi</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on calcule <strong>une seule fois</strong> la<br/>
puissance pour la moitié de l'exposant, puis on<br/>
multiplie ce résultat par lui-même (et par <code>a</code><br/>
supplémentaire si <code>n</code> est impair). Complexité<br/>
$O(\log n)$ multiplications.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q27 : Partition du tri rapide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans le tri rapide, l'opération de<br/>
<strong>partitionnement</strong> autour d'un pivot consiste à :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Conséquence : si le pivot est mal choisi (extremum), la<br/>
partition peut produire deux moitiés très<br/>
déséquilibrées (par exemple $0$ et $n-1$ éléments), ce<br/>
qui dégrade la complexité à $O(n^2)$. C'est pourquoi<br/>
le choix du pivot (médiane, aléatoire) est crucial.</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 le tableau de sorte que tous les<br/>
éléments inférieurs au pivot soient à sa<br/>
gauche, et tous les éléments supérieurs à sa<br/>
droite ; le pivot lui-même est alors à sa position<br/>
finale dans le tableau trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'étape clé du tri rapide.<br/>
Une fois le pivot positionné, on trie récursivement<br/>
chacune des deux moitiés. La partition se fait en<br/>
$O(n)$ avec un parcours linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Diviser le tableau en deux parties de taille égale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est ce que fait le tri <strong>fusion</strong>, pas<br/>
le tri rapide. Le tri rapide partitionne autour<br/>
d'une valeur (le pivot), pas autour de la position<br/>
médiane. Les deux moitiés peuvent être de tailles<br/>
très différentes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compter le nombre d'inversions dans le tableau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : compter les inversions est une opération<br/>
d'analyse, pas une étape du tri rapide. Aucun lien<br/>
avec le partitionnement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier la liste avant de choisir un pivot</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait absurde, puisque le but du tri<br/>
rapide est précisément de trier. La partition est<br/>
une étape <strong>préliminaire</strong> au tri, sans tri<br/>
préalable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q28 : DPR sans combinaison coûteuse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La recherche dichotomique satisfait la récurrence<br/>
$T(n) = T(n/2) + O(1)$. Pourquoi obtient-on<br/>
$O(\log n)$ et non $O(n \log n)$ comme dans le tri<br/>
fusion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général : pour la récurrence<br/>
$T(n) = a \cdot T(n/b) + O(n^c)$ : si $a &lt; b^c$, le<br/>
coût est dominé par la combinaison, complexité<br/>
$O(n^c)$ ; si $a = b^c$, on a $O(n^c \log n)$ ; si<br/>
$a &gt; b^c$, on a $O(n^{\log_b a})$. Pour la<br/>
dichotomie : $a = 1$, $b = 2$, $c = 0$, donc<br/>
$a = b^c = 1$, complexité $O(\log n)$.</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 qu'il n'y a qu'un seul sous-problème à<br/>
chaque appel (au lieu de deux), et que la<br/>
combinaison se fait en temps constant $O(1)$<br/>
(au lieu de $O(n)$)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dichotomie ne fait qu'<strong>un seul</strong><br/>
appel récursif (sur la moitié pertinente) et la<br/>
combinaison se résume à un test d'égalité ou de<br/>
comparaison. La somme géométrique des coûts donne<br/>
$O(\log n)$. Au tri fusion, on a deux appels et une<br/>
fusion en $O(n)$, ce qui donne $O(n \log n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la recherche dichotomique n'est pas un<br/>
algorithme diviser pour régner</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle relève bien du paradigme. Elle<br/>
divise l'espace de recherche par deux à chaque<br/>
appel, illustration classique du DPR.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la recherche dichotomique fonctionne<br/>
uniquement sur des tableaux de taille puissance de<br/>
deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche dichotomique fonctionne pour<br/>
toute taille. Cette propriété n'a aucun rapport<br/>
avec sa complexité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les comparaisons sont gratuites en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les comparaisons coûtent du temps comme<br/>
toute opération. Mais elles sont en nombre<br/>
constant à chaque appel récursif, ce qui fait la<br/>
différence avec une fusion en $O(n)$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q29 : Trace du tri fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On applique le tri fusion à la liste<br/>
<code>[5, 2, 8, 3]</code>. Quelles sont les listes<br/>
passées à la fusion finale (la dernière<br/>
étape, qui produit la liste triée<br/>
complète) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma global du tri fusion : une phase<br/>
descendante de découpage récursif (jusqu'aux<br/>
singletons), suivie d'une phase remontante<br/>
de fusions successives. Pour $n = 4$, la<br/>
structure d'appels forme un arbre binaire<br/>
complet de hauteur $\log_2 4 = 2$. À chaque<br/>
niveau, le coût total des fusions est en<br/>
$O(n)$, d'où la complexité globale en<br/>
$O(n \log n)$.</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>[2, 3, 5, 8]</code> et <code>[]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fusion combine deux<br/>
moitiés non vides. Une moitié vide<br/>
signifierait qu'on a fait un seul tri<br/>
récursif suivi d'une fusion sans<br/>
contrepartie, ce qui n'est pas le<br/>
tri fusion.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[5]</code>, <code>[2]</code>, <code>[8]</code>, <code>[3]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les listes singletons<br/>
obtenues à la fin du découpage. La<br/>
fusion finale ne combine que <strong>deux</strong><br/>
listes, pas quatre. Quatre singletons<br/>
impliqueraient deux fusions<br/>
intermédiaires avant la fusion finale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[5, 2]</code> et <code>[8, 3]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les deux moitiés<br/>
obtenues après le <strong>premier</strong> découpage,<br/>
mais avant les tris récursifs. À la<br/>
fusion finale, ces moitiés ont déjà<br/>
été triées et sont devenues <code>[2, 5]</code><br/>
et <code>[3, 8]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>[2, 5]</code> et <code>[3, 8]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on découpe d'abord en<br/>
<code>[5, 2]</code> et <code>[8, 3]</code>. On trie<br/>
récursivement chaque moitié : <code>[5, 2]</code><br/>
devient <code>[2, 5]</code> après fusion de <code>[5]</code><br/>
et <code>[2]</code> ; <code>[8, 3]</code> devient <code>[3, 8]</code><br/>
après fusion de <code>[8]</code> et <code>[3]</code>. La<br/>
fusion finale combine <code>[2, 5]</code> et<br/>
<code>[3, 8]</code> pour produire <code>[2, 3, 5, 8]</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q30 : Code de la fonction de fusion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction Python implémente<br/>
correctement la <strong>fusion</strong> de deux listes<br/>
déjà triées en une seule liste triée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette fonction est le cœur du tri fusion :<br/>
la qualité de l'algorithme global vient<br/>
de l'efficacité linéaire de la fusion.<br/>
Variante intéressante : implémenter la<br/>
fusion <strong>en place</strong> dans la liste<br/>
d'origine, ce qui économise de la<br/>
mémoire. C'est cependant plus délicat à<br/>
coder et n'apporte pas de gain en<br/>
complexité asymptotique.</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>def fusion(a, b):
    return a + b</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la simple concaténation ne<br/>
trie pas. Si <code>a = [1, 4, 7]</code> et <code>b =<br/>
[2, 3, 5]</code>, on obtiendrait<br/>
<code>[1, 4, 7, 2, 3, 5]</code>, qui n'est pas<br/>
trié. Il faut entrelacer les deux<br/>
listes par comparaisons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def fusion(a, b):
    return sorted(a + b)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette version fonctionne mais<br/>
n'illustre pas l'algorithme : on délègue<br/>
au tri intégré, qui ne tire pas parti<br/>
du fait que <code>a</code> et <code>b</code> sont déjà<br/>
triées. Complexité : $O((n+m) \log(n+m))$<br/>
au lieu de $O(n + m)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def fusion(a, b):
    resultat = []
    for x in a:
        for y in b:
            if x &lt;= y:
                resultat.append(x)
            else:
                resultat.append(y)
    return resultat</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la double boucle imbriquée a<br/>
une complexité $O(n \cdot m)$ au lieu<br/>
de $O(n + m)$. De plus, on ajoute des<br/>
éléments en double (chaque élément de<br/>
<code>a</code> est comparé à chaque élément de<br/>
<code>b</code>, et chaque comparaison ajoute une<br/>
valeur). Le résultat n'est ni trié, ni<br/>
de la bonne taille.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def fusion(a, b):
    i, j = 0, 0
    resultat = []
    while i &lt; len(a) and j &lt; len(b):
        if a[i] &lt;= b[j]:
            resultat.append(a[i])
            i += 1
        else:
            resultat.append(b[j])
            j += 1
    resultat.extend(a[i:])
    resultat.extend(b[j:])
    return resultat</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on utilise deux indices<br/>
<code>i</code> et <code>j</code> pour parcourir les deux<br/>
listes en parallèle. À chaque tour, on<br/>
ajoute le plus petit des deux éléments<br/>
de tête, et on avance l'indice<br/>
correspondant. Quand l'une des listes<br/>
est épuisée, on copie simplement le<br/>
reste de l'autre. Complexité : $O(n + m)$<br/>
où $n$ et $m$ sont les longueurs des<br/>
deux listes. Le <code>&lt;=</code> (plutôt que <code>&lt;</code>)<br/>
dans la comparaison garantit la<br/>
stabilité du tri.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Diviser pour régner — Q31 : Code du partitionnement</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans le tri rapide, l'étape de<br/>
<strong>partitionnement</strong> réorganise un tableau<br/>
autour d'un pivot. Quel code Python<br/>
implémente correctement cette étape (avec<br/>
le pivot pris comme dernier élément du<br/>
sous-tableau, schéma de Lomuto) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le schéma de Lomuto est le plus simple à<br/>
retenir, mais celui de <strong>Hoare</strong> (avec<br/>
deux indices qui se rapprochent l'un de<br/>
l'autre) est en général un peu plus<br/>
efficace en pratique. Le choix du pivot<br/>
est crucial : avec un mauvais pivot<br/>
(extremum), la complexité dégénère à<br/>
$O(n^2)$. Stratégies courantes : pivot<br/>
aléatoire, médiane de trois, 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[<pre><code>def partitionner(tab, debut, fin):
    gauche = [x for x in tab if x &lt;= tab[fin]]
    droite = [x for x in tab if x &gt; tab[fin]]
    return gauche + droite</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette version fonctionne <strong>logiquement</strong><br/>
(elle produit une liste partitionnée),<br/>
mais elle crée deux nouvelles listes,<br/>
ce qui contredit l'esprit du tri<br/>
rapide qui est de trier <strong>en place</strong><br/>
avec une mémoire $O(\log n)$ pour la<br/>
pile. De plus, la signature ne renvoie<br/>
pas l'indice du pivot.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def partitionner(tab, debut, fin):
    pivot = tab[fin]
    i = debut - 1
    for j in range(debut, fin):
        if tab[j] &lt;= pivot:
            i += 1
            tab[i], tab[j] = tab[j], tab[i]
    tab[i + 1], tab[fin] = tab[fin], tab[i + 1]
    return i + 1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le schéma de<br/>
Lomuto. L'indice <code>i</code> représente la<br/>
frontière entre les éléments « plus<br/>
petits que le pivot » (avant <code>i</code>) et<br/>
ceux « plus grands » (entre <code>i</code> et<br/>
<code>j</code>). À la fin, on place le pivot à sa<br/>
position définitive (entre les deux<br/>
zones), et la fonction renvoie cette<br/>
position. Complexité : $O(n)$ pour le<br/>
partitionnement seul, $O(n \log n)$ en<br/>
moyenne pour le tri complet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def partitionner(tab, debut, fin):
    return tab[fin]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code ne fait que renvoyer<br/>
le pivot sans réorganiser le tableau.<br/>
Le partitionnement doit déplacer<br/>
activement les éléments selon leur<br/>
comparaison au pivot.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def partitionner(tab, debut, fin):
    tab.sort()
    return len(tab) // 2</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier le tableau entier<br/>
court-circuite tout l'intérêt du tri<br/>
rapide. Et le partitionnement ne doit<br/>
pas trier mais réarranger autour du<br/>
pivot.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
