Devoirs Première

Liste des fichiers Notebook

Devoir Maison – Première NSI

Thématiques abordées

Exercice 1 : Recherche dichotomique

On souhaite écrire une fonction recherche_dichotomique(tab, valeur) qui prend en paramètre :

La fonction doit renvoyer l’indice où se trouve la valeur dans la liste si elle est présente, et -1 sinon.

Rappels sur le principe de la recherche dichotomique

  1. On compare la valeur recherchée avec l’élément central de la liste.
  2. Si la valeur est égale à l’élément central, on a trouvé l’indice !
  3. Si la valeur est plus petite que l’élément central, on restreint la recherche à la sous-liste de gauche.
  4. Si la valeur est plus grande que l’élément central, on restreint la recherche à la sous-liste de droite.
  5. On répète le processus sur la sous-liste correspondante (elle-même coupée en deux, etc.).

À faire

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

Exercice 2 : Rappel sur le tri

2.1) Tri par sélection

On vous demande d'implémenter un algorithme de tri par sélection (_selection sort_).

Principe du tri par sélection :

  1. On cherche l’élément minimum dans la liste complète, on l’échange avec l’élément à la position 0.
  2. Ensuite, on cherche le minimum dans la sous-liste qui commence à l’indice 1, et on l’échange avec l’élément en position 1.
  3. On recommence jusqu’à ce que la liste soit triée.

À faire :

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]

Exercice 3 : Tri par insertion dichotomique

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 :

Partie A

Position d’insertion par recherche dichotomique

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].

Rappel de la recherche dichotomique

  1. On compare la valeur avec l’élément central de la sous-liste courante.
  2. Si valeur est plus petite, on réduit la recherche à la moitié gauche. Si elle est plus grande, on réduit à la moitié droite.
  3. On itère jusqu’à ce que debut > fin.
  4. Lorsque la boucle se termine, l’indice debut représente l’endroit où insérer la valeur (si elle n’est pas déjà présente).

Consignes

  1. Complétez la fonction ci-dessous pour qu’elle renvoie l’indice où insérer valeur dans l’ordre croissant.
  2. Faites quelques tests simples (vous pouvez utiliser une cellule en dessous) pour valider votre fonction.
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
    

Tests (Partie A)

# 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)

Partie B

Tri par insertion dichotomique

On va maintenant utiliser notre fonction position_insertion_dichotomique pour créer un algorithme de tri par insertion :

  1. On considère que la partie [tab(0)] (le premier élément) est "déjà triée".
  2. On parcourt le tableau de l'indice i = 1 jusqu’à n-1.
  3. Pour l’élément tab[i] :
    • On trouve sa position d’insertion pos dans la sous-liste tab[0..i-1] (déjà triée) grâce à position_insertion_dichotomique.
    • On décale les éléments pour laisser la place à la valeur_a_inserer.
    • On insère valeur_a_inserer à l’indice pos.

Travail à faire

def insertion_dichotomique(tab):
    """Trie la liste 'tab' en place en utilisant
    le tri par insertion et la recherche dichotomique."""
    
    # À compléter
    

Tests (Partie B)

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))  # []