<?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⁹, 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²).</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²)</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ⁿ)</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ⁿ en exploitant<br/>
quelle propriété mathématique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour calculer a²⁰ : 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ⁿ = aⁿ⁻¹ · 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ⁿ = a + a + ·s + 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 · a</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la définition de n · a, pas de aⁿ.<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/>
≥ 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 for et<br/>
while. 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²)</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 sorted intégrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : utiliser sorted é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ⁿ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour n = 10¹⁸, la méthode naïve ferait 10¹⁸ - 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ⁿ = a · aⁿ⁻¹, 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²)</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 · 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 · 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 &lt;= plutôt que &lt; 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²)) ?</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⁶, n² = 10¹² 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² / 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 (demi = puissance(a, n // 2)), 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>
<p>`<code><br/>
def recherche(x, tab):<br/>
    gauche, droite = 0, len(tab) - 1<br/>
    while gauche &lt; droite:        # ← ICI<br/>
        milieu = (gauche + droite) // 2<br/>
        if tab[milieu] == x:<br/>
            return milieu<br/>
        elif tab[milieu] &lt; x:<br/>
            gauche = milieu + 1<br/>
        else:<br/>
            droite = milieu - 1<br/>
    return -1<br/>
</code>`</p>
<p>Quel est le bug ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Erreur subtile et classique. Test concret : avec<br/>
tab = [5] et x = 5, on a gauche = droite = 0, la<br/>
condition gauche &lt; droite 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 milieu avant la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : milieu 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 gauche &lt;= droite (avec &lt;= au lieu de &lt;)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec &lt; strict, on n'examine pas le<br/>
dernier élément quand gauche == droite. 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 milieu est incorrect</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le calcul (gauche + droite) // 2 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²), 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²). 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²)</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²). 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 · 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ᶜ) 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²).</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⁴)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 4^{\log_2 n} = n^{\log_2 4} = n^2, pas 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 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²)</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 RecursionError 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²), 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ⁿ entièrement, puis prendre le modulo</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour a = 1024 et n = 10⁹, aⁿ 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³)</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ⁿ)</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 ≥ 0) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Idée centrale : sauvegarder le résultat de<br/>
puissance(a, n // 2) 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[<p>`<code><br/>
def puissance(a, n):<br/>
    if n == 0:<br/>
        return 1<br/>
    if n % 2 == 0:<br/>
        return puissance(a, n // 2) <em> puissance(a, n // 2)<br/>
    return a </em> puissance(a, n // 2) * puissance(a, n // 2)<br/>
</code>`</p>]]></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[<p>`<code><br/>
def puissance(a, n):<br/>
    if n == 0:<br/>
        return 1<br/>
    return a * puissance(a, n - 1)<br/>
</code>`</p>]]></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[<p>`<code><br/>
def puissance(a, n):<br/>
    return a ** n<br/>
</code>`</p>]]></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[<p>`<code><br/>
def puissance(a, n):<br/>
    if n == 0:<br/>
        return 1<br/>
    demi = puissance(a, n // 2)<br/>
    if n % 2 == 0:<br/>
        return demi <em> demi<br/>
    return a </em> demi * demi<br/>
</code>`</p>]]></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 a<br/>
supplémentaire si n 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²). 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 · T(n/b) + O(nᶜ) : si a &lt; bᶜ, le<br/>
coût est dominé par la combinaison, complexité<br/>
O(nᶜ) ; si a = bᶜ, on a O(n^c \log n) ; si<br/>
a &gt; bᶜ, on a O(n^{\log_b a}). Pour la<br/>
dichotomie : a = 1, b = 2, c = 0, donc<br/>
a = bᶜ = 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/>
[5, 2, 8, 3]. 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>[2, 3, 5, 8] et []</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>[5], [2], [8], [3]</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>[5, 2] et [8, 3]</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 [2, 5]<br/>
et [3, 8].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[2, 5] et [3, 8]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on découpe d'abord en<br/>
[5, 2] et [8, 3]. On trie<br/>
récursivement chaque moitié : [5, 2]<br/>
devient [2, 5] après fusion de [5]<br/>
et [2] ; [8, 3] devient [3, 8]<br/>
après fusion de [8] et [3]. La<br/>
fusion finale combine [2, 5] et<br/>
[3, 8] pour produire [2, 3, 5, 8].</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[<p>`<code><br/>
def fusion(a, b):<br/>
    return a + b<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la simple concaténation ne<br/>
trie pas. Si a = [1, 4, 7] et b =<br/>
[2, 3, 5], on obtiendrait<br/>
[1, 4, 7, 2, 3, 5], 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[<p>`<code><br/>
def fusion(a, b):<br/>
    return sorted(a + b)<br/>
</code>`</p>]]></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 a et b 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[<p>`<code><br/>
def fusion(a, b):<br/>
    resultat = []<br/>
    for x in a:<br/>
        for y in b:<br/>
            if x &lt;= y:<br/>
                resultat.append(x)<br/>
            else:<br/>
                resultat.append(y)<br/>
    return resultat<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la double boucle imbriquée a<br/>
une complexité O(n · m) au lieu<br/>
de O(n + m). De plus, on ajoute des<br/>
éléments en double (chaque élément de<br/>
a est comparé à chaque élément de<br/>
b, 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[<p>`<code><br/>
def fusion(a, b):<br/>
    i, j = 0, 0<br/>
    resultat = []<br/>
    while i &lt; len(a) and j &lt; len(b):<br/>
        if a[i] &lt;= b[j]:<br/>
            resultat.append(a[i])<br/>
            i += 1<br/>
        else:<br/>
            resultat.append(b[j])<br/>
            j += 1<br/>
    resultat.extend(a[i:])<br/>
    resultat.extend(b[j:])<br/>
    return resultat<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on utilise deux indices<br/>
i et j 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 &lt;= (plutôt que &lt;)<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²). 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[<p>`<code><br/>
def partitionner(tab, debut, fin):<br/>
    gauche = [x for x in tab if x &lt;= tab[fin]]<br/>
    droite = [x for x in tab if x &gt; tab[fin]]<br/>
    return gauche + droite<br/>
</code>`</p>]]></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[<p>`<code><br/>
def partitionner(tab, debut, fin):<br/>
    pivot = tab[fin]<br/>
    i = debut - 1<br/>
    for j in range(debut, fin):<br/>
        if tab[j] &lt;= pivot:<br/>
            i += 1<br/>
            tab[i], tab[j] = tab[j], tab[i]<br/>
    tab[i + 1], tab[fin] = tab[fin], tab[i + 1]<br/>
    return i + 1<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le schéma de<br/>
Lomuto. L'indice i représente la<br/>
frontière entre les éléments « plus<br/>
petits que le pivot » (avant i) et<br/>
ceux « plus grands » (entre i et<br/>
j). À 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[<p>`<code><br/>
def partitionner(tab, debut, fin):<br/>
    return tab[fin]<br/>
</code>`</p>]]></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[<p>`<code><br/>
def partitionner(tab, debut, fin):<br/>
    tab.sort()<br/>
    return len(tab) // 2<br/>
</code>`</p>]]></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>
