diff --git a/README.md b/README.md new file mode 100644 index 0000000..2187f05 --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +# Ex 2 + +```py +def function_1(tableau1, tableau2): + presentDansDeuxListes = 0 + for nombre1 in tableau1: # O(n) + for nombre2 in tableau2: # O(n²) + if nombre1 == nombre2: + presentDansDeuxListes += 1 + break + return presentDansDeuxListes +``` + +cette fonction à une complexité de **O(n²)** + +--- + +```py +def function_2(x): + valeur = 0 + while x > 0: # O(n) + valeur = valeur + x + x -= 1 # si x = 300, on passe dans le while 300 fois + return valeur +``` + +cette fonction a une complexité de **O(n)** + +--- + +```py +def function_3(x): + valeur = 0 + if x < 0: + valeur = -x + if x == 0: + pass + if x > 0: + valeur = x + return valeur +``` + +cette fonction a une complexité de **O(1)** + + +# Ex 3 + +```py +def entree_tri_fusion_multi(tab): + return [tri_fusion(sub_tab) for sub_tab in tab] # Appliquer le tri fusion à chaque sous-tableau + +def tri_fusion(tab): + if len(tab) <= 2: + if tab[0] > tab[-1]: + return tab[::-1] + return tab + mid = len(tab) // 2 # Trouver le milieu du tableau + left = tri_fusion(tab[:mid]) # Diviser et trier la moitié gauche + right = tri_fusion(tab[mid:]) # Diviser et trier la moitié droite + return fusion(left, right) # Fusionner les deux moitiés triées + +def fusion(left, right): + result = [] + i = j = 0 + while i < len(left) and j < len(right): # Tant qu'il reste des éléments dans les deux sous-tableaux + if left[i] < right[j]: # Comparer les éléments des deux sous-tableaux + result.append(left[i]) # Ajouter l'élément de gauche s'il est plus petit + i += 1 + else: + result.append(right[j]) # Ajouter l'élément de droite sinon + j += 1 + result.extend(left[i:]) # Ajouter les éléments restants de gauche + result.extend(right[j:]) # Ajouter les éléments restants de droite + return result +``` + +--- + +```py +from tri_fusion import entree_tri_fusion_multi + +tab = [[5, 2, 9, 1, 5, 6], [3, 0, -1, 8, 7], [10, 20, 15, 30]] +sorted_tab = entree_tri_fusion_multi(tab) +print("Tableau trié :", sorted_tab) +``` + +```bash +Tableau trié : [[1, 2, 5, 5, 6, 9], [-1, 0, 3, 7, 8], [10, 15, 20, 30]] +``` + +La complexité de l'algorithme de tri fusion est **O(n log n)** pour chaque sous-tableau, où *n* est la taille du sous-tableau. Comme `entree_tri_fusion_multi` applique le tri fusion à chaque sous-tableau indépendamment, la complexité totale dépend de la somme des tailles des sous-tableaux, mais chaque tri reste en **O(n log n)**. + + diff --git a/__pycache__/tri_fusion.cpython-313.pyc b/__pycache__/tri_fusion.cpython-313.pyc new file mode 100644 index 0000000..59df5db Binary files /dev/null and b/__pycache__/tri_fusion.cpython-313.pyc differ diff --git a/test.py b/test.py new file mode 100644 index 0000000..aa88c45 --- /dev/null +++ b/test.py @@ -0,0 +1,5 @@ +from tri_fusion import entree_tri_fusion_multi + +tab = [[5, 2, 9, 1, 5, 6], [3, 0, -1, 8, 7], [10, 20, 15, 30]] +sorted_tab = entree_tri_fusion_multi(tab) +print("Tableau trié :", sorted_tab) \ No newline at end of file diff --git a/tri_fusion.py b/tri_fusion.py new file mode 100644 index 0000000..496a902 --- /dev/null +++ b/tri_fusion.py @@ -0,0 +1,26 @@ +def entree_tri_fusion_multi(tab): + return [tri_fusion(sub_tab) for sub_tab in tab] # Appliquer le tri fusion à chaque sous-tableau + +def tri_fusion(tab): + if len(tab) <= 2: + if tab[0] > tab[-1]: + return tab[::-1] + return tab + mid = len(tab) // 2 # Trouver le milieu du tableau + left = tri_fusion(tab[:mid]) # Diviser et trier la moitié gauche + right = tri_fusion(tab[mid:]) # Diviser et trier la moitié droite + return fusion(left, right) # Fusionner les deux moitiés triées + +def fusion(left, right): + result = [] + i = j = 0 + while i < len(left) and j < len(right): # Tant qu'il reste des éléments dans les deux sous-tableaux + if left[i] < right[j]: # Comparer les éléments des deux sous-tableaux + result.append(left[i]) # Ajouter l'élément de gauche s'il est plus petit + i += 1 + else: + result.append(right[j]) # Ajouter l'élément de droite sinon + j += 1 + result.extend(left[i:]) # Ajouter les éléments restants de gauche + result.extend(right[j:]) # Ajouter les éléments restants de droite + return result \ No newline at end of file