Aller au contenu

Numérique et sciences informatiques (spécialité) · TerminaleBac

Diviser pour régner et tri fusion : exercices corrigés de Terminale

Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur

L'essentiel

  • Un algorithme diviser pour régner suit trois phases : diviser le problème, régner sur les sous-problèmes, combiner les résultats 12.
  • Le tri fusion coupe le tableau en deux moitiés, trie chaque moitié par le même procédé, puis fusionne les deux moitiés triées.
  • La fusion de deux listes triées avance deux indices : on compare les têtes de liste et on recopie la plus petite.
  • Pour une taille n=2kn=2^k, il y a kk niveaux de découpage, et chaque niveau traite au total nn éléments.
  • La relation T(n)=2T(n/2)+nT(n)=2T(n/2)+n se résout par dépliage ; elle donne nlog⁡2nn\log_2 n opérations pour les puissances de 2.

Comment utiliser ces exercices

Ces exercices te font manipuler la méthode diviser pour régner, puis son exemple le plus classique au programme : le tri fusion. Ils vont du plus simple (reconnaître les phases, fusionner à la main) au plus exigeant (compter des opérations, résoudre une relation de récurrence). Cherche chaque exercice sur papier avant d'ouvrir les indices, puis compare avec la correction étape par étape.

Un intérêt majeur de cette famille d'algorithmes est leur faible complexité 2. Les exercices 6 et 7 te font voir d'où elle vient en comptant toi-même les opérations. Pour les cas plus délicats que ceux de ce chapitre, il existe des théorèmes qui facilitent le calcul de la complexité, dont le principal est connu sous le nom de Master theorem 2 ; ici, tu t'en passeras en dépliant la récurrence à la main.

Les exercices

Exercice 1 Reconnaître les trois phases

★☆☆Environ 5 min

On trie le tableau [5, 2, 9, 1] avec le tri fusion.

  1. Écris les deux moitiés obtenues à la première phase de division.
  2. Pour chacune des trois phases (diviser, régner, combiner), indique à quel moment elle intervient dans cet exemple.
  3. Donne le résultat final.
Indice 1

Coupe le tableau au milieu : la taille 4 donne deux moitiés de taille 2.

Indice 2

Les moitiés de taille 2 sont elles-mêmes coupées, jusqu'à des tableaux d'un seul élément.

Voir la correction pas à pas
  1. Diviser : [5, 2, 9, 1] donne [5, 2] et [9, 1].

  2. Les moitiés sont à leur tour divisées : [5], [2], [9], [1]. Ces tableaux d'un seul élément sont triés, c'est le cas de base.

  3. Régner : on trie chaque moitié en appelant le tri fusion sur elle, ce qui revient ici à descendre jusqu'aux tableaux d'un élément.

  4. Combiner : on fusionne [5] et [2] en [2, 5], puis [9] et [1] en [1, 9].

  5. Dernière combinaison : on fusionne [2, 5] et [1, 9] en [1, 2, 5, 9].

Les trois phases se retrouvent à chaque niveau de la récursion : on divise en descendant, on combine en remontant 2. Le résultat est [1, 2, 5, 9].

Exercice 2 Fusionner deux listes triées

★☆☆Environ 8 min

On fusionne les listes triées A = [1, 4, 7] et B = [2, 3, 9] en comparant à chaque étape les deux plus petits éléments restants.

  1. Écris la liste fusionnée.
  2. Combien de comparaisons d'éléments ont été faites avant que l'une des listes soit épuisée ?
Indice 1

Garde un indice sur chaque liste. À chaque comparaison, tu recopies le plus petit et tu avances l'indice de sa liste.

Indice 2

Une fois qu'une liste est épuisée, on ne compare plus rien : on recopie le reste de l'autre.

Voir la correction pas à pas
  1. Compare 1 et 2 : on prend 1. Résultat : [1]. Comparaison n°1.

  2. Compare 4 et 2 : on prend 2. Résultat : [1, 2]. Comparaison n°2.

  3. Compare 4 et 3 : on prend 3. Résultat : [1, 2, 3]. Comparaison n°3.

  4. Compare 4 et 9 : on prend 4. Comparaison n°4. Compare 7 et 9 : on prend 7. Comparaison n°5. Résultat : [1, 2, 3, 4, 7].

  5. La liste A est épuisée. On recopie le reste de B, c'est-à-dire 9, sans comparaison. Résultat : [1, 2, 3, 4, 7, 9].

  6. On compte 5 comparaisons, soit 3+3−13+3-1.

La liste fusionnée est [1, 2, 3, 4, 7, 9], obtenue avec 5 comparaisons. Retiens que fusionner deux listes de tailles pp et qq demande au plus p+q−1p+q-1 comparaisons : chaque comparaison place un élément, et le dernier est placé sans comparaison.

Exercice 3 Compter les niveaux de découpage

★☆☆Environ 6 min

On trie un tableau de 16 éléments avec le tri fusion, en coupant toujours en deux moitiés égales jusqu'à obtenir des tableaux d'un seul élément.

  1. Écris la taille des tableaux à chaque niveau de découpage.
  2. Combien de fois faut-il diviser par 2 pour passer de 16 à 1 ?
  3. Exprime ce nombre avec un logarithme.
Indice 1

Pars de 16 et divise par 2 jusqu'à tomber sur 1.

Indice 2

Si 2k=162^k=16, alors kk est le logarithme de base 2 de 16.

Voir la correction pas à pas
  1. Les tailles successives sont 16, 8, 4, 2, 1.

  2. Entre 16 et 1, il y a quatre divisions par 2 : 16→8→4→2→116\to8\to4\to2\to1.

  3. On a donc 24=162^4=16, ce qui s'écrit log⁡216=4\log_2 16=4.

  4. Il y a 4 niveaux de découpage pour 16 éléments.

Pour n=2kn=2^k éléments, il y a k=log⁡2nk=\log_2 n niveaux de découpage. C'est ce petit nombre de niveaux qui rend la méthode efficace : la profondeur de la récursion croît très lentement avec nn.

Exercice 4 Dérouler complètement un tri fusion

★★☆Environ 15 min

On applique le tri fusion à [38, 27, 43, 3, 9, 82, 10], qui compte 7 éléments. Quand la taille est impaire, la moitié de gauche reçoit un élément de moins que celle de droite.

  1. Donne les deux moitiés de la première division, puis toutes les divisions suivantes.
  2. Écris chaque fusion dans l'ordre où elle s'effectue.
  3. Combien de fusions ont été faites en tout ?
Indice 1

Taille 7 : la moitié de gauche a 3 éléments, celle de droite en a 4.

Indice 2

Dans la moitié de gauche [38, 27, 43], on coupe en [38] et [27, 43].

Voir la correction pas à pas
  1. Première division : [38, 27, 43] et [3, 9, 82, 10].

  2. Côté gauche : [38, 27, 43] donne [38] et [27, 43] ; puis [27, 43] donne [27] et [43].

  3. Côté droit : [3, 9, 82, 10] donne [3, 9] et [82, 10] ; puis [3, 9] donne [3] et [9], et [82, 10] donne [82] et [10].

  4. Fusions à gauche : [27] et [43] donnent [27, 43] ; puis [38] et [27, 43] donnent [27, 38, 43].

  5. Fusions à droite : [3] et [9] donnent [3, 9] ; [82] et [10] donnent [10, 82] ; puis [3, 9] et [10, 82] donnent [3, 9, 10, 82].

  6. Fusion finale : [27, 38, 43] et [3, 9, 10, 82] donnent [3, 9, 10, 27, 38, 43, 82].

  7. On compte 2 fusions à gauche, 3 à droite et 1 finale : 6 fusions en tout.

Le tableau trié est [3, 9, 10, 27, 38, 43, 82]. Chaque fusion réduit d'une unité le nombre de blocs triés : on part de 7 blocs d'un élément et on termine avec 1 seul bloc, donc 7−1=67-1=6 fusions. Ce raisonnement donne n−1n-1 fusions pour nn éléments, quelle que soit la façon de couper.

Exercice 5 Compléter la fonction de fusion en Python

★★☆Environ 15 min

Voici une fonction qui fusionne deux listes triées g et d. Trois endroits sont à compléter (repérés par ???).

def fusion(g, d):
    i = 0
    j = 0
    res = []
    while i < len(g) and ???:
        if g[i] <= d[j]:
            res.append(g[i])
            i = i + 1
        else:
            res.append(???)
            j = j + 1
    return res + ???
  1. Complète les trois ???.
  2. Écris ensuite la fonction tri_fusion(t) qui utilise fusion, en précisant le cas de base.
  3. Pourquoi la condition g[i] <= d[j] utilise-t-elle <= plutôt que < quand il y a des doublons ?
Indice 1

La boucle doit s'arrêter dès que l'une des deux listes est épuisée : il faut tester que j est encore valide pour d.

Indice 2

Après la boucle, une des deux listes est vide de restes ; l'autre peut contenir des éléments à recopier, sous forme de tranches g[i:] et d[j:].

Indice 3

Pour la division en deux moitiés, utilise milieu = len(t) // 2.

Voir la correction pas à pas
  1. La boucle continue tant que les deux listes ont encore des éléments : while i < len(g) and j < len(d):.

  2. Dans le else, c'est l'élément de d qui est le plus petit : res.append(d[j]).

  3. À la sortie de la boucle, au moins une des deux listes est épuisée. Le reste de l'autre est déjà trié et se recopie à la fin : return res + g[i:] + d[j:]. Une des deux tranches est vide.

  4. Le tri récursif : si len(t) <= 1, on renvoie t (cas de base). Sinon milieu = len(t) // 2, puis return fusion(tri_fusion(t[:milieu]), tri_fusion(t[milieu:])).

  5. Avec <=, quand deux valeurs sont égales, on prend d'abord celle de la liste de gauche. Les éléments égaux gardent alors leur ordre d'origine : le tri est dit stable. Avec <, le résultat resterait trié, mais l'ordre relatif des égaux pourrait changer.

La fonction complète est :

def fusion(g, d):
    i = 0
    j = 0
    res = []
    while i < len(g) and j < len(d):
        if g[i] <= d[j]:
            res.append(g[i])
            i = i + 1
        else:
            res.append(d[j])
            j = j + 1
    return res + g[i:] + d[j:]

def tri_fusion(t):
    if len(t) <= 1:
        return t
    milieu = len(t) // 2
    return fusion(tri_fusion(t[:milieu]), tri_fusion(t[milieu:]))

On y retrouve les trois phases : la ligne milieu divise, les deux appels récursifs règnent, fusion combine 1.

Exercice 6 Estimer le nombre d'opérations

★★☆Environ 12 min

On trie un tableau de n=1024n=1024 éléments avec le tri fusion, en supposant que tous les découpages sont parfaitement égaux.

  1. Combien de niveaux de découpage y a-t-il ?
  2. À chaque niveau, les fusions traitent ensemble les nn éléments du tableau. Estime le nombre total d'éléments placés par les fusions.
  3. Un tri « naïf » qui compare chaque élément à tous les autres effectue de l'ordre de n2n^2 opérations. Calcule n2n^2 et compare.
Indice 1

1024=2101024=2^{10}.

Indice 2

Nombre total = (nombre de niveaux) ×\times nn.

Voir la correction pas à pas
  1. Comme 1024=2101024=2^{10}, il y a log⁡21024=10\log_2 1024=10 niveaux de découpage.

  2. À chaque niveau, les fusions rangent en tout 1024 éléments : un niveau coûte de l'ordre de n=1024n=1024 placements.

  3. Total estimé : 10×1024=10 24010\times1024=10\,240 placements.

  4. Pour la méthode naïve : n2=10242=1 048 576n^2=1024^2=1\,048\,576.

  5. Rapport : 1 048 576/10 240≈1021\,048\,576/10\,240\approx102. La méthode naïve fait de l'ordre de cent fois plus d'opérations.

Le tri fusion effectue de l'ordre de nlog⁡2nn\log_2 n placements, soit ici 10 240. L'écart avec n2n^2 grandit vite quand nn augmente : c'est cette faible complexité qui fait l'intérêt des algorithmes diviser pour régner 2. Il s'agit d'une estimation de l'ordre de grandeur, pas d'un décompte exact des comparaisons.

Exercice 7 Résoudre une relation de récurrence

★★★Environ 20 min

Soit T(n)T(n) le nombre d'éléments placés par un tri fusion sur nn éléments, avec n=2kn=2^k. On modélise : T(1)=0T(1)=0 et, pour n≥2n\geq2, T(n)=2 T(n/2)+nT(n)=2\,T(n/2)+n.

  1. Explique le sens de chacun des deux termes de la relation.
  2. Calcule T(2)T(2), T(4)T(4), T(8)T(8), T(16)T(16) et T(32)T(32).
  3. Conjecture une formule pour T(2k)T(2^k), puis démontre-la par récurrence sur kk.
Indice 1

Le terme 2T(n/2)2T(n/2) correspond à la phase « régner », le terme nn à la phase « combiner ».

Indice 2

Compare chaque valeur trouvée à n×kn\times k.

Indice 3

Pour l'hérédité, écris T(2k+1)=2T(2k)+2k+1T(2^{k+1})=2T(2^k)+2^{k+1} et remplace T(2k)T(2^k) par l'hypothèse.

Voir la correction pas à pas
  1. Le terme 2T(n/2)2T(n/2) est le coût des deux appels récursifs sur des moitiés de taille n/2n/2 (régner). Le terme nn est le coût de la fusion, qui place nn éléments (combiner).

  2. T(2)=2T(1)+2=2T(2)=2T(1)+2=2.

  3. T(4)=2T(2)+4=8T(4)=2T(2)+4=8 ; T(8)=2T(4)+8=24T(8)=2T(4)+8=24.

  4. T(16)=2T(8)+16=64T(16)=2T(8)+16=64 ; T(32)=2T(16)+32=160T(32)=2T(16)+32=160.

  5. On observe : T(2)=2×1T(2)=2\times1, T(4)=4×2T(4)=4\times2, T(8)=8×3T(8)=8\times3, T(16)=16×4T(16)=16\times4, T(32)=32×5T(32)=32\times5. Conjecture : T(2k)=k⋅2kT(2^k)=k\cdot2^k.

  6. Initialisation : pour k=0k=0, T(1)=0=0×20T(1)=0=0\times2^0.

  7. Hérédité : on suppose T(2k)=k⋅2kT(2^k)=k\cdot2^k. Alors T(2k+1)=2T(2k)+2k+1=2k⋅2k+2k+1=(k+1)⋅2k+1T(2^{k+1})=2T(2^k)+2^{k+1}=2k\cdot2^k+2^{k+1}=(k+1)\cdot2^{k+1}. La propriété passe au rang k+1k+1.

  8. Conclusion : pour tout entier k≥0k\geq0, T(2k)=k⋅2kT(2^k)=k\cdot2^k, soit T(n)=nlog⁡2nT(n)=n\log_2 n.

On obtient T(32)=160=32×log⁡232T(32)=160=32\times\log_2 32. La formule T(n)=nlog⁡2nT(n)=n\log_2 n pour nn puissance de 2 confirme l'estimation de l'exercice précédent. Pour des récurrences de forme plus générale, des théorèmes comme le Master theorem évitent de déplier à la main 2.

Exercice 8 L'algorithme d'Euclide vu comme diviser pour régner

★★★Environ 15 min

L'algorithme d'Euclide, qui sert à trouver le pgcd de deux entiers, est parfois présenté comme un cas de diviser pour régner : à chaque étape, on remplace le couple de départ par un couple de nombres plus petits 2. On rappelle que pgcd(a,b)=pgcd(b,r)\text{pgcd}(a,b)=\text{pgcd}(b,r) où rr est le reste de la division euclidienne de aa par bb, et que pgcd(a,0)=a\text{pgcd}(a,0)=a.

  1. Calcule pgcd(252,105)\text{pgcd}(252,105) en écrivant chaque division.
  2. Écris la fonction récursive correspondante en Python.
  3. Compare avec le tri fusion : combien de sous-problèmes à chaque étape ? Y a-t-il une vraie phase « combiner » ?
Indice 1

Divise 252 par 105 : le reste est 42.

Indice 2

Continue avec le couple (105, 42), puis (42, 21).

Voir la correction pas à pas
  1. 252=2×105+42252=2\times105+42, donc pgcd(252,105)=pgcd(105,42)\text{pgcd}(252,105)=\text{pgcd}(105,42).

  2. 105=2×42+21105=2\times42+21, donc pgcd(105,42)=pgcd(42,21)\text{pgcd}(105,42)=\text{pgcd}(42,21).

  3. 42=2×21+042=2\times21+0, donc pgcd(42,21)=pgcd(21,0)=21\text{pgcd}(42,21)=\text{pgcd}(21,0)=21.

  4. Fonction : def pgcd(a, b): puis if b == 0: return a puis return pgcd(b, a % b).

  5. Comparaison : à chaque étape il n'y a qu'un seul sous-problème, et non deux comme dans le tri fusion. Il n'y a pas de combinaison : la réponse du sous-problème est renvoyée telle quelle.

pgcd(252,105)=21\text{pgcd}(252,105)=21. Cet exemple montre que l'idée « se ramener à un problème plus petit » dépasse le tri. Il montre aussi une différence : le tri fusion découpe en deux sous-problèmes qu'il faut ensuite recombiner, alors qu'Euclide se ramène à un seul sous-problème sans combinaison.

Exercice 9 Choisir la bonne méthode et la justifier

★★★Environ 15 min

On souhaite trouver le plus grand élément d'un tableau de 8 valeurs : [7, 3, 12, 5, 9, 1, 8, 4].

  1. Décris un algorithme diviser pour régner qui coupe le tableau en deux moitiés, cherche le maximum de chacune, puis combine.
  2. Applique-le au tableau donné et trace les appels.
  3. Combien de comparaisons la phase « combiner » effectue-t-elle au total ?
Indice 1

Le cas de base est un tableau d'un seul élément : son maximum est cet élément.

Indice 2

Combiner deux maximums revient à une seule comparaison.

Voir la correction pas à pas
  1. Algorithme : si le tableau a un élément, on le renvoie. Sinon on coupe en deux, on calcule le maximum de chaque moitié par un appel récursif, et on renvoie le plus grand des deux.

  2. Division : [7, 3, 12, 5] et [9, 1, 8, 4], puis [7, 3], [12, 5], [9, 1], [8, 4].

  3. Combinaisons de niveau le plus bas : max(7, 3) = 7 ; max(12, 5) = 12 ; max(9, 1) = 9 ; max(8, 4) = 8. Soit 4 comparaisons.

  4. Niveau suivant : max(7, 12) = 12 ; max(9, 8) = 9. Soit 2 comparaisons.

  5. Dernière combinaison : max(12, 9) = 12. Soit 1 comparaison.

  6. Total : 4+2+1=74+2+1=7 comparaisons, c'est-à-dire 8−18-1.

Le maximum est 12, obtenu avec 7 comparaisons. Une simple boucle qui parcourt le tableau en effectue aussi 7 : ici, diviser pour régner n'apporte aucun gain de coût. Cette méthode n'est donc pas à appliquer partout ; elle devient intéressante quand la combinaison est peu coûteuse par rapport au gain obtenu en réduisant la taille, comme pour le tri.

Les questions qu'on se pose

Pourquoi le tri fusion est-il plus rapide qu'un tri qui compare chaque élément aux autres ?

Parce que le travail est réparti sur peu de niveaux. Pour n=2kn=2^k éléments, il y a kk niveaux de découpage, et chaque niveau traite au total nn éléments, ce qui donne de l'ordre de nlog⁡2nn\log_2 n opérations (exercices 6 et 7). Un tri naïf qui compare chaque élément à tous les autres s'approche de n2n^2. La faible complexité est l'un des principaux intérêts de la méthode 2.

Comment savoir si un problème se prête à diviser pour régner ?

Pose-toi trois questions : peut-on couper le problème en sous-problèmes de même nature, plus petits ? Peut-on résoudre directement les plus petits (cas de base) ? Peut-on assembler facilement leurs solutions ? Si oui aux trois, la méthode convient 12. Si la combinaison coûte autant que de résoudre le problème directement, comme pour la recherche du maximum (exercice 8), le gain disparaît.

Que faut-il écrire au bac pour justifier un tri fusion ?

Identifie clairement les trois phases : où l'on divise, où l'on appelle la fonction sur les moitiés, où l'on fusionne. Donne le cas de base (tableau d'au plus un élément) et précise que la fusion suppose deux listes déjà triées. Si l'on te demande un coût, compte les niveaux de découpage puis ce que traite chaque niveau, comme dans l'exercice 6.

Sources

  1. Algorithmes diviser pour régner et tri fusion - Ressource Éduscol, Éduscol. Consulté le 7 novembre 2026.
  2. Diviser pour régner (informatique), Wikipédia. Consulté le 7 novembre 2026.

Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page