*La Flamme est une série Canal+ parodiant les émissions de téléréalité sentimentale de type Bachelor.*
---
### Contexte
Marc, le Bachelor de *La Flamme*, arrive à la **Grande Cérémonie des Roses Finale**.
Il a rencontré douze prétendant·e·s au fil des épisodes, et son équipe de production a calculé un **score de compatibilité** pour chacun·e.
Le problème : la liste est dans le désordre, et Marc doit la parcourir **classée du moins compatible au plus compatible** pour ménager le suspense et remettre la rose en dernier au ou à la grand·e vainqueur·e.
1. Vérifier sur deux ou trois prétendant·e·s que la formule donne bien le score indiqué.
---
### Partie 1 - Tri par sélection *(rappel de Première)*
La première stratégie de la production s'appelle **"La Rose du Moins Aimé"** :
> "À chaque cérémonie, on parcourt *tous* les prétendant·e·s encore classé·e·s, on identifie celui ou celle qui a le score le plus bas, et on le ou la place en premier. On recommence jusqu'à avoir tout classé."
1. En une phrase, expliquer en quoi cette description correspond au **tri par sélection**.
2. Compléter la fonction suivante :
```python
deftri_selection(tab):
n=len(tab)
foriinrange(n):
idx_min=i
forjinrange(i+1,n):
iftab[j]["score"]<tab[idx_min]["score"]:
# à compléter
pass
# à compléter : echanger tab[i] et tab[idx_min]
returntab
```
3. Appliquer `tri_selection` à la liste `pretendants` et afficher les noms dans l'ordre obtenu.
4. Pour une liste de **n** prétendant·e·s, combien de comparaisons de scores effectue cet algorithme au total ? Exprimer le résultat en fonction de n, puis calculer pour n = 12.
---
### Partie 2 - Tri fusion *(diviser pour régner)*
La deuxième stratégie de la production s'appelle **"Les Deux Villas"** :
> "On sépare les prétendant·e·s en deux groupes. On classe chaque groupe séparément. Puis on réunit les deux listes classées en une seule, en les fusionnant."
C'est exactement l'algorithme de **tri fusion**, vu dans le cours.
#### 2.1 - La fonction `fusionner`
```python
deffusionner(gauche,droite):
resultat=[]
i,j=0,0
whilei<len(gauche)andj<len(droite):
ifgauche[i]["score"]<=droite[j]["score"]:
resultat.append(gauche[i])
i+=1
else:
resultat.append(droite[j])
j+=1
returnresultat+gauche[i:]+droite[j:]
```
1. Expliquer le rôle des variables `i` et `j` dans cette fonction.
2. Que se passe-t-il à la ligne `return resultat + gauche[i:] + droite[j:]` ?
Pourquoi est-il nécessaire d'ajouter `gauche[i:]` et `droite[j:]` à la fin ?
3. Appliquer *à la main*`fusionner` sur ces deux sous-listes déjà triées, et écrire le résultat étape par étape :
Marc, dans un élan de narcissisme, décide finalement de classer les prétendant·e·s **par charme décroissant** plutôt que par score.
Modifier la fonction `fusionner` pour trier selon `charme` en ordre **décroissant**. Appliquer le tri fusion modifié à la liste et afficher le classement final.