From 281f59da844e6d01c81a721aef877ff1bfe3295d Mon Sep 17 00:00:00 2001 From: "DESKTOP-ISVPJFT\\Mathieu" Date: Fri, 24 Nov 2023 17:02:24 +0100 Subject: [PATCH 1/3] Commit Mathieu Chicoine TP tris --- README.md | 2 +- sort/fusion.py | 31 ++++++++++++++++++++++++++++++- sort/insertion.py | 12 ++++++++++++ sort/range.py | 13 ++++++++++++- sort/recursion.py | 11 ++++++++++- sort/selection.py | 16 ++++++++++++++++ 6 files changed, 81 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 74f925a..b686c2d 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Tracez le graphique correspondant. Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? *Écrivez votre réponse ici* ### 2. Tri par insertion - + Observez attentivement l'animation de tri par insertion ci-dessous pour en comprendre le fonctionnement. diff --git a/sort/fusion.py b/sort/fusion.py index 73a21d3..cfef9dd 100644 --- a/sort/fusion.py +++ b/sort/fusion.py @@ -1,2 +1,31 @@ def sort(array: list[int]) -> list[int]: - return array + """Tri par algorithme de fusion""" + if len(array) <= 1: + print(array) + return array + else: + print(array) + array1: list[int] = array[0 : len(array) // 2] + sort(array1) + array2: list[int] = array[len(array) // 2: len(array)] + sort(array2) + return merge(array1, array2) + + +def merge(array1: list[int], array2: list[int]) -> list[int]: + """Donne 1 liste triée à partir de 2 listes triées""" + array: list[int] = [] + + while len(array1) > 1 or len(array2) > 1: + print("merging arrays", array1, array2) + if array1[0] < array2[0]: + array.append(array1[0]) + array1.pop(0) + else: + array.append(array2[0]) + array2.pop(0) + + return array + array1 + array2 + +merge([1, 2, 5], [3, 4, 6]) +#print(sort([1, 2, 5, 6, 3, 4, 7, 8, 9])) \ No newline at end of file diff --git a/sort/insertion.py b/sort/insertion.py index 73a21d3..5b6b098 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -1,2 +1,14 @@ def sort(array: list[int]) -> list[int]: + """Tri par algorithme d'insersion""" + len_list = len(array) + for index in range(1, len_list): + value = array[index] + j = index - 1 + while j >= 0 and array[j] > value: + array[j + 1], array[j] = array[j], value + j -= 1 + return array + + +print(sort([1, 2, 3, 4, 6, 9, 5, 7, 9, 1, 2, 0])) \ No newline at end of file diff --git a/sort/range.py b/sort/range.py index fc252ab..9108fe5 100644 --- a/sort/range.py +++ b/sort/range.py @@ -1,2 +1,13 @@ +import random +import time + + def generate_array_of_number(array_size: int) -> list[int]: - return [] + """Description""" + array = [random.randint(0, 100) for i in range(array_size)] + return array + +start: float = time.time() +generate_array_of_number(10) +end: float = time.time() +print("Temps écoulé :", end - start) \ No newline at end of file diff --git a/sort/recursion.py b/sort/recursion.py index e7f4320..1f5935b 100644 --- a/sort/recursion.py +++ b/sort/recursion.py @@ -1,2 +1,11 @@ def get_factorial(number: int) -> int: - return number + """factoctorielle""" + + if number <= 1: + return number + else: + return number * get_factorial(number - 1) + + + +print(get_factorial(5)) \ No newline at end of file diff --git a/sort/selection.py b/sort/selection.py index 73a21d3..aa08280 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -1,2 +1,18 @@ def sort(array: list[int]) -> list[int]: + """Tri par algorithme de sélection""" + len_list = len(array) + + for index in range(len_list - 1): + min_index = index + + for j in range(index + 1, len_list): + if array[j] < array[min_index]: + min_index = j + + # échanger les valeurs seulement si nécessaire + if min_index != index: + array[index], array[min_index] = array[min_index], array[index] + return array + +print(sort([1, 2, 3, 4, 6, 9, 5, 7, 9, 1, 2, 0])) From ab6b9f639ef735b23bf069f1b4290241d364b1ce Mon Sep 17 00:00:00 2001 From: "DESKTOP-ISVPJFT\\Mathieu" Date: Mon, 27 Nov 2023 03:16:27 +0100 Subject: [PATCH 2/3] TP Tris Mathieu Chicoine --- README.md | 23 ++++++----- __main__.py | 98 +++++++++++++++++++++++++++++++++++++++++++++- chart.png | Bin 0 -> 17781 bytes pyproject.toml | 15 +++++++ sort/fusion.py | 40 ++++++++++--------- sort/insertion.py | 4 -- sort/range.py | 14 ++----- sort/recursion.py | 10 +---- sort/selection.py | 3 +- 9 files changed, 152 insertions(+), 55 deletions(-) create mode 100644 chart.png create mode 100644 pyproject.toml diff --git a/README.md b/README.md index b686c2d..292a103 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Mesurez combien de temps prend python à générer un tableau composés de : Sur un tableur, générez un tableau permettant de visualiser le temps d'éxécution en fonction de la taille de l'entrée. -Comment vous semble évoluer la courbe ? Observez bien les différentes courbes du graphique ci-dessous. Quelle est la plus ressemblante à notre situation ? *Écrivez votre réponse ici* +Comment vous semble évoluer la courbe ? Observez bien les différentes courbes du graphique ci-dessous. Quelle est la plus ressemblante à notre situation ? Une droite en NlogN @@ -75,7 +75,7 @@ Observez attentivement l'animation de tri par sélection ci-dessous pour en comp -Écrivez en français classique ce que vous voyez. Quel est le fonctionnement ? Comment l'expliqueriez-vous à quelqu'un ? *Écrivez votre réponse ici* +Écrivez en français classique ce que vous voyez. Quel est le fonctionnement ? Comment l'expliqueriez-vous à quelqu'un ? L'algo cherche le plus petit élément de la liste en la parcourant, il l'échange avec le premier, puis recommence, il prend à nouveau le plus petit (mais sans compter ceux triés évidement) et le déplace. Jusqu'à avoir trié la liste Puis implémentez l'algorithme en python dans la fonction `sort` du fichier `sort/selection.py`. Vérifiez son bon fonctionnement en éxécutant le fichier `python3 -m unittest`. Le test correspondant au tri par sélection doit passer. @@ -86,17 +86,16 @@ Mesurez le temps d'éxécution pour un tableau de : - ... - 10000 entrées -Tracez le graphique correspondant. - -Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? *Écrivez votre réponse ici* +Tracez le graphique correspondant. voir main +Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? N² ### 2. Tri par insertion Observez attentivement l'animation de tri par insertion ci-dessous pour en comprendre le fonctionnement. -Écrivez en français classique ce que vous voyez. Quel est le fonctionnement ? Comment l'expliqueriez-vous à quelqu'un ? *Écrivez votre réponse ici* +Écrivez en français classique ce que vous voyez. Quel est le fonctionnement ? Comment l'expliqueriez-vous à quelqu'un ? L'algorithme parcourt la liste un élément après l'autre et place l'élément au bon endroit par rapport aux précédents Puis implémentez l'algorithme en python dans la fonction `sort` du fichier `sort/insertion.py`. Utilisez les tests automatiques pour vérifier votre implémentation. @@ -107,9 +106,9 @@ Mesurez le temps d'éxécution pour un tableau de : - ... - 10000 entrées -Tracez le graphique correspondant. +Tracez le graphique correspondant. voir main -Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? *Écrivez votre réponse ici* +Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? N² ### 3. Tri par fusion @@ -154,7 +153,7 @@ Observez bien le schéma suivant : il représente le concept du tri par fusion. Cet algorithme est de type "diviser pour régner". -Écrivez en français classique ce que vous voyez. Quel est le fonctionnement ? Comment l'expliqueriez-vous à quelqu'un ? *Écrivez votre réponse ici* +Écrivez en français classique ce que vous voyez. Quel est le fonctionnement ? Comment l'expliqueriez-vous à quelqu'un ? Il trie une liste efficassement via une séries d'étapes répétées à plusieurs échelles. Il y a 2 grandes étapes : 1/ couper la liste en 2 listes, puis chacune en 2 etc. jusqu'à laisser que des listes de 1 élément. 2/ Il rassemble chaque liste par paire en les les triant (trie que les premières valeurs entre elles mais comme on part de listes de 1 élément elles sont finalement toutes triées) Complétez la fonction `sort` du fichier `sort/fusion.py` en suivant les instructions suivantes. @@ -174,15 +173,15 @@ Mesurez le temps d'éxécution pour un tableau de : Tracez le graphique correspondant. -Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? *Écrivez votre réponse ici* +Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? N² -Question bonus : Y a-t-il des tailles de tableaux pour lesquelles le tri par fusion n'est pas aussi rapide que les précédents tris abordés ? *Écrivez votre réponse ici* +Question bonus : Y a-t-il des tailles de tableaux pour lesquelles le tri par fusion n'est pas aussi rapide que les précédents tris abordés ? pour de petits tableaux ### 4. sort() Bien que tout cela soit fascinant, Python possède sa propre méthode de tri : `sort()`. -Une dernière fois, analysez le temps d'exécution et découvrez si python fait mieux que nos implémentations rudimentaires ;) +Une dernière fois, analysez le temps d'exécution et découvrez si python fait mieux que nos implémentations rudimentaires :) ## Pour rendre ce TP diff --git a/__main__.py b/__main__.py index 98a585e..05dc533 100644 --- a/__main__.py +++ b/__main__.py @@ -1,5 +1,101 @@ +import time +import numpy as np +import matplotlib.pyplot as plt +from sort.fusion import sort as fusion_sort +from sort.insertion import sort as insertion_sort +from sort.selection import sort as selection_sort +from sort.range import generate_array + + +def measure_time(algo_func, array): + """Mesurer la durée d'exécution d'une fonction de tri""" + start_time = time.time() + algo_func(array) + end_time = time.time() + return end_time - start_time + + def main(): - print("Hello world") + """Fonction principale""" + max_tab_size = int(input("Enter the maximum size of the array: ")) + num_sizes = int(input("Enter the number of array sizes to generate: ")) + critical_time = float(input("Enter the critical time for stopping the \ + execution (in seconds): ")) + + # Choix de l'échelle avec par défaut la logarithmique + scale_choice = input("Choose scale (linear/log): ").lower() + if scale_choice not in ['linear', 'log']: + # Utilisation de l'échelle logarithmique par défaut + scale_choice = 'log' + + # Générer des tableaux intermédiaires de taille croissante + if scale_choice == 'log': + sizes = np.logspace(0, np.log10(max_tab_size), num=num_sizes, + endpoint=True, base=10, dtype=int) + else: + sizes = np.linspace(1, max_tab_size, num=num_sizes, dtype=int) + + selection_times = [] + insertion_times = [] + fusion_times = [] + + # Variables de contrôle pour arrêter la mesure du temps pour chaque algo + stop_selection = False + stop_insertion = False + stop_fusion = False + + for size in sizes: + tab = generate_array(size) + + # Mesurer la durée d'exécution du tri par SELECTION + if not stop_selection: + selection_time = measure_time(selection_sort, tab.copy()) + selection_times.append(selection_time) + if size < max_tab_size and selection_time > critical_time: + print(f"Selection Sort exceeded critical time ({critical_time}\ + seconds) for size {size}. Stopping.") + stop_selection = True + + # Mesurer la durée d'exécution du tri par insertion + if not stop_insertion: + insertion_time = measure_time(insertion_sort, tab.copy()) + insertion_times.append(insertion_time) + if size < max_tab_size and insertion_time > critical_time: + print(f"Insertion Sort exceeded critical time ({critical_time}\ + seconds) for size {size}. Stopping.") + stop_insertion = True + + # Mesurer la durée d'exécution du tri par FUSION + if not stop_fusion: + fusion_time = measure_time(fusion_sort, tab.copy()) + fusion_times.append(fusion_time) + if size < max_tab_size and fusion_time > critical_time: + print(f"Fusion Sort exceeded critical time ({critical_time}\ + seconds) for size {size}. Stopping.") + stop_fusion = True + + # Vérifier si tous les algorithmes ont atteint le seuil critique + if stop_selection and stop_insertion and stop_fusion: + break + + # Créer un graphique avec la légende à gauche + plt.plot(sizes[:len(selection_times)], selection_times, + label='Selection Sort', marker='o') + plt.plot(sizes[:len(insertion_times)], insertion_times, + label='Insertion Sort', marker='o') + plt.plot(sizes[:len(fusion_times)], fusion_times, label='Fusion Sort', + marker='o') + + if scale_choice == 'log': + # Utiliser échelle logarithmique pour l'axe des x + plt.xscale('log') + + # Paramètres du graph + plt.xlabel('Array Size') + plt.ylabel('Time (s)') + plt.title('Comparison of Sorting Algorithms') + plt.legend(loc='upper left') + plt.show() main() diff --git a/chart.png b/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..6e01775ee88fa65e30d349205e5d38df63f8c71f GIT binary patch literal 17781 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 tY7>vEIhO list[int]: """Tri par algorithme de fusion""" if len(array) <= 1: - print(array) return array - else: - print(array) - array1: list[int] = array[0 : len(array) // 2] - sort(array1) - array2: list[int] = array[len(array) // 2: len(array)] - sort(array2) - return merge(array1, array2) + + if len(array) <= 10: + # Utiliser un tri plus simple pour de petites listes + return sorted(array) + + mid = len(array) // 2 + left = sort(array[:mid]) + right = sort(array[mid:]) + return merge(left, right) def merge(array1: list[int], array2: list[int]) -> list[int]: """Donne 1 liste triée à partir de 2 listes triées""" array: list[int] = [] - while len(array1) > 1 or len(array2) > 1: - print("merging arrays", array1, array2) - if array1[0] < array2[0]: - array.append(array1[0]) - array1.pop(0) + # Indices pour les deux listes + i = j = 0 + + while i < len(array1) and j < len(array2): + if array1[i] < array2[j]: + array.append(array1[i]) + i += 1 else: - array.append(array2[0]) - array2.pop(0) + array.append(array2[j]) + j += 1 - return array + array1 + array2 + # Ajouter les éléments restants de array1 et array2 + array.extend(array1[i:]) + array.extend(array2[j:]) -merge([1, 2, 5], [3, 4, 6]) -#print(sort([1, 2, 5, 6, 3, 4, 7, 8, 9])) \ No newline at end of file + return array diff --git a/sort/insertion.py b/sort/insertion.py index 5b6b098..b778eeb 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -7,8 +7,4 @@ def sort(array: list[int]) -> list[int]: while j >= 0 and array[j] > value: array[j + 1], array[j] = array[j], value j -= 1 - return array - - -print(sort([1, 2, 3, 4, 6, 9, 5, 7, 9, 1, 2, 0])) \ No newline at end of file diff --git a/sort/range.py b/sort/range.py index 9108fe5..34096fa 100644 --- a/sort/range.py +++ b/sort/range.py @@ -1,13 +1,7 @@ import random -import time -def generate_array_of_number(array_size: int) -> list[int]: - """Description""" - array = [random.randint(0, 100) for i in range(array_size)] - return array - -start: float = time.time() -generate_array_of_number(10) -end: float = time.time() -print("Temps écoulé :", end - start) \ No newline at end of file +def generate_array(array_size: int) -> list[int]: + """Génère un tableau de n entiers posififs aléatoires (avec n la + taille du tableau en para)""" + return [random.randint(0, 100) for i in range(array_size)] diff --git a/sort/recursion.py b/sort/recursion.py index 1f5935b..8133e99 100644 --- a/sort/recursion.py +++ b/sort/recursion.py @@ -1,11 +1,3 @@ def get_factorial(number: int) -> int: """factoctorielle""" - - if number <= 1: - return number - else: - return number * get_factorial(number - 1) - - - -print(get_factorial(5)) \ No newline at end of file + return number if number <= 1 else number * get_factorial(number - 1) diff --git a/sort/selection.py b/sort/selection.py index aa08280..7807045 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -9,10 +9,11 @@ def sort(array: list[int]) -> list[int]: if array[j] < array[min_index]: min_index = j - # échanger les valeurs seulement si nécessaire + # Echanger les valeurs si nécessaire if min_index != index: array[index], array[min_index] = array[min_index], array[index] return array + print(sort([1, 2, 3, 4, 6, 9, 5, 7, 9, 1, 2, 0])) From d6ce23dbf5c74e34f897ec522f3c5142a5c00d4a Mon Sep 17 00:00:00 2001 From: "DESKTOP-ISVPJFT\\Mathieu" Date: Mon, 27 Nov 2023 03:27:59 +0100 Subject: [PATCH 3/3] TP Tris Mathieu Chicoine --- sort/insertion.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/sort/insertion.py b/sort/insertion.py index b778eeb..857513a 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -1,10 +1,16 @@ def sort(array: list[int]) -> list[int]: - """Tri par algorithme d'insersion""" + """Tri par algorithme d'insertion""" len_list = len(array) for index in range(1, len_list): value = array[index] - j = index - 1 - while j >= 0 and array[j] > value: - array[j + 1], array[j] = array[j], value - j -= 1 + start = index - 1 + + # Trouver le bon emplacement en déplaçant les éléments plus grands + while start >= 0 and array[start] > value: + array[start + 1] = array[start] + start -= 1 + + # Insérer la valeur à la bonne position + array[start + 1] = value + return array