On souhaite écrire une fonction recherche_dichotomique(tab, valeur)
qui prend en paramètre :
tab
: une liste de nombres triés par ordre croissant,valeur
: la valeur à chercher dans tab
.La fonction doit renvoyer l’indice où se trouve la valeur dans la liste si elle est présente, et -1
sinon.
recherche_dichotomique(tab, valeur)
.def recherche_dichotomique(tab, valeur):
"""Recherche dichotomique d'une valeur dans un tableau trié.
Retourne l'indice de la valeur si trouvée, -1 sinon."""
# Compléter le code
# Tests
liste_test = [1, 3, 5, 7, 9, 11]
print(recherche_dichotomique(liste_test, 7)) # Attendu : 3
print(recherche_dichotomique(liste_test, 2)) # Attendu : -1
On vous demande d'implémenter un algorithme de tri par sélection (_selection sort_).
Principe du tri par sélection :
À faire :
tri_selection(tab)
, qui trie en place la liste tab
.def tri_selection(tab):
"""Trie la liste tab en place par sélection."""
# À compléter
# Tests
liste_test = [11, 3, 5, 7, 9, 1]
print(tri_selection(liste_test)) # Doit être triée : [1, 3, 5, 7, 9, 11]
Dans cet exercice, nous allons mettre en œuvre un tri par insertion amélioré grâce à la recherche dichotomique.
Nous allons découper le travail en deux parties :
Nous voulons une fonction position_insertion_dichotomique(tab, debut, fin, valeur)
qui recherche la position d’insertion appropriée de valeur
dans la sous-liste déjà triée tab[debut..fin]
.
valeur
avec l’élément central de la sous-liste courante.valeur
est plus petite, on réduit la recherche à la moitié gauche. Si elle est plus grande, on réduit à la moitié droite.debut > fin
.debut
représente l’endroit où insérer la valeur
(si elle n’est pas déjà présente).valeur
dans l’ordre croissant.def position_insertion_dichotomique(tab, debut, fin, valeur):
"""Retourne l'indice où insérer 'valeur' dans la sous-liste triée tab[debut..fin],
en utilisant une recherche dichotomique."""
# À compléter
# Exemple de tests simples
sous_liste = [1, 3, 5, 7, 9]
print(position_insertion_dichotomique(sous_liste, 0, 4, 4)) # Attendu 2
print(position_insertion_dichotomique(sous_liste, 0, 4, 10)) # Attendu 5 (en fin)
print(position_insertion_dichotomique(sous_liste, 0, 4, 0)) # Attendu 0 (en début)
print(position_insertion_dichotomique(sous_liste, 0, 4, 7)) # Attendu 3 (7 déjà présent)
On va maintenant utiliser notre fonction position_insertion_dichotomique
pour créer un algorithme de tri par insertion :
[tab(0)]
(le premier élément) est "déjà triée".i = 1
jusqu’à n-1
.tab[i]
:pos
dans la sous-liste tab[0..i-1]
(déjà triée) grâce à position_insertion_dichotomique
.valeur_a_inserer
.valeur_a_inserer
à l’indice pos
.insertion_dichotomique(tab)
ci-dessous.def insertion_dichotomique(tab):
"""Trie la liste 'tab' en place en utilisant
le tri par insertion et la recherche dichotomique."""
# À compléter
Essayez plusieurs exemples et vérifiez si la liste est réellement triée à la fin.
liste_test1 = [5, 2, 9, 1, 3, 8]
print("Liste triée :", insertion_dichotomique(liste_test1)) # [1, 2, 3, 5, 8, 9]
liste_test2 = [10, 9, 8, 7, 2, 0]
print("Liste triée :", insertion_dichotomique(liste_test2)) # [0, 2, 7, 8, 9, 10]
liste_test3 = [1]
print("Liste triée :", insertion_dichotomique(liste_test3)) # [1]
liste_test4 = []
print("Liste triée :", insertion_dichotomique(liste_test4)) # []