Académique Documents
Professionnel Documents
Culture Documents
YOUSSOU DIENG
PROBLÈME : LE TRI D’UNE SUITE DE N NOMBRES
01/11/2023
ANALYSE DU PROBLÈME
01/11/2023
COMMENT OBTENIR CE RÉSULTAT ? (TRAITEMENT)
01/11/2023
COMMENT OBTENIR CE RÉSULTAT ? (TRAITEMENT)
INSPIRATION …
¡ Méthode diviser-pour-régner
01/11/2023
COMMENT OBTENIR CE RÉSULTAT ? (TRAITEMENT)
ANALYSE DE LA MÉTHODE DIVISER POUR RÉGNER
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la
réponse triée.
5 2 4 7 1 3 2 6
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la 2 5 4 7 1 3 2 6
réponse triée.
5 2 4 7 1 3 2 6
2 4 5 7 1 2 3 6
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la 2 5 4 7 1 3 2 6
réponse triée.
5 2 4 7 1 3 2 6
2 4 5 7 1 2 3 6
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la 2 5 4 7 1 3 2 6
réponse triée.
5 2 4 7 1 3 2 6
¡ Problème :
Combiner/Fusionner 2 4 5 7 1 2 3 6
01/11/2023
piles R
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 0 0 0 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 0 0 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 0 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 6 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 6 7 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 6 7 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
Comment implémenter une Pile vide?
épuisement de l’une des piles A et
B. Placer en bas de chaque pile une carte sentinelle
(une valeur spéciale) pour ne pas vérifier à
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à chaque fois si l’une des piles est vide.
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMPLEXITÉ
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié. » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
Correction
2. n2 ← 𝑟 − 𝑞
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1] • Initialisation : Montrer que
4. Pour i ← 1 à n1 l’invariant est vrai avant la première
5. Faire L[i] ← A[p + i - 1]
itération de la boucle pour (lignes
6. Pour j ← 1 à n2
12–17).
7. Faire R[j] ← A[p + j]
8. L[n1 + 1] ← +∞
• Conservation : Montrer que chaque
9. L[n2 + 1] ← +∞
itération de la boucle conserve
10. i ← 1 l’invariant.
11. j ← 1 • Terminaison : Montrer que
12. Pour k ← p à r l’invariant fournit une propriété utile
13. Faire si L[i] ≤ R[j]
pour prouver la conformité de la
alors 𝐴 𝑘 ← L[i]
14.
procédure quand la boucle se
15. i←𝑖+1
16. sinon 𝐴 𝑘 ← R[j]
termine.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
¡ Initialisation:
¡ Avant la première itération de la boucle, on a k = p, et le sous-tableau A[p . . k − 1]
est vide. Il contient les k − p = 0 plus petits éléments de L et R ; et, comme i = j =
1, L[i] et R[j] sont les plus petits éléments de leurs tableaux à ne pas avoir été
copiés dans A.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 2 4 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 2 4 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 2 4 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 3 4 5 6 7 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 3 4 5 6 7 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 3 4 5 6 7 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
𝑞1 = 2
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
𝑞1 = 2
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5 2 4 7 1 3 2 6
5. Fusion (A, p, q, r)
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5 4 7 1 3 2 6
Tri-Fusion ( A, p, r)
1. Si p < 𝑟 2 4 5 7 1 2 3 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5 4 7 1 3 2 6
Comme
¡ le temps d’exécution tri par fusion est T(n)= Θ (nlog2 n) et que
¡ le tri par insertion a un temps d’exécution qui vaut Θ (n2),
on dira que tri par fusion est meilleur que le tri par
insertion.
01/11/2023
FEUILLE DE TD 3
¡ 2.2.3 On considère une fois de plus la recherche linéaire (voir exercice 2.1.3). Combien d’éléments de la séquence
d’entrée doit-on tester en moyenne, si l’on suppose que l’élément recherché a une probabilité égale d’être l’un
quelconque des éléments du tableau ? Et dans le cas le plus défavorable ? Quels sont les temps d’exécution du cas
moyen et du cas le plus défavorable, exprimés avec la notation Θ? Justifier les réponses.
¡ 2.2.4 Comment modifier la plupart des algorithmes pour qu’ils aient un bon temps d’exécution dans le cas le plus
favorable ?
01/11/2023
2.3.1 EN S’INSPIRANT DE LA FIGURE SUIVANTE, ILLUSTRER LE FONCTIONNEMENT DU TRI PAR
FUSION SUR LE TABLEAU A = « 3, 41, 52, 26, 38, 57, 9, 49 ».
01/11/2023
¡ 2.3.2 Réécrire la procédure FUSION de telle sorte qu’elle n’emploie
pas de sentinelles mais qu’à la place elle s’arrête quand l’un des deux
tableaux L et R a eu tous ses éléments copiés dans A, en copiant alors
le reste de l’autre tableau dans A.
01/11/2023
¡ Pour k := p à r faire
¡ Si i ≤ 𝑛1 𝑒𝑡 𝑗 ≤ 𝑛2 alors
¡ si L[i] ≤ R[j] alors
¡ A[k]:= L[i]
¡ i := i+1
¡ sinon A[k]:= R[j]
¡ j:=j+1
¡ FINSI
¡ Sinon si i ≤ 𝑛1 alors
¡ A[k]:= L[i]
¡ i := i+1
Sinon si 𝑗 ≤ 𝑛2 alors
¡ A[k]:= R[j]
¡ j:=j+1
¡ Finsi
¡ Finsi
¡ Finsi
¡ Fin 01/11/2023
¡ 2.3.5 En reprenant le problème de la recherche (voir exercice 2.1.3), observez que, si la séquence A est triée, on peut comparer le
milieu de la séquence avec v et supprimer la moitié de la séquence pour la suite des opérations. La recherche dichotomique est
un algorithme qui répète cette procédure, en divisant par deux à chaque fois la taille de la partie restante de la séquence.
1. Écrire le pseudo code, itératif ou récursif, de la recherche dichotomique.
2. Expliquer pourquoi le temps d’exécution de la recherche dichotomique, dans le cas le plus défavorable, est Θ (lg n).
Algorithme
01/11/2023