From 6102f40ccbb56c3f277e0b612daba5c645146173 Mon Sep 17 00:00:00 2001 From: damriera Date: Wed, 15 Oct 2025 09:54:55 +0200 Subject: [PATCH] fin du td --- README.md | 93 +++++++++++++++++++++++++ __pycache__/tri_fusion.cpython-313.pyc | Bin 0 -> 1434 bytes test.py | 5 ++ tri_fusion.py | 26 +++++++ 4 files changed, 124 insertions(+) create mode 100644 README.md create mode 100644 __pycache__/tri_fusion.cpython-313.pyc create mode 100644 test.py create mode 100644 tri_fusion.py 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 0000000000000000000000000000000000000000..59df5db842eeb54e6ab1643a696d104c9f25ed74 GIT binary patch literal 1434 zcmey&%ge>Uz`&3b^ghFhg@NHQhy%lnP{wC51_p+y48aUi3`GpVj8Y6mjKNG&3`I=o z%$h98FjXMMYzzzx%nS?+pIyK@LK%b^!WfI0^cjkogc&^e7#Q*xqv7g98BL+=0484n z1_o{h1%_g#JVq6UVkQVHjX{&qPm}Q$S4mN3d|GL7W`3R~(=Fzb#H3s7#idE{C5cJJ zObiSR3JSLj^)vEwQ}t64bBi)lixTynLPL!8LtISaU0lOV4dWq#2xIgLDsPFW=9Lts zrp6;g<8w=MN-~Ss85kHqE-RL2U|?uqxT$Y+ncH|(@dEcAuL=4 z$N?5-2xbUoHUf*PFoZIwFkm-HmkAuQppXZ}0?0&$P(~KGU3pB=aJdM^U*T&}8v@3F5p2$-Mmk|NnnY=3C4;sd+^pgKn`wBZH*~! zvJ(kIRKk*g0z)WsFq1AX14ACOzXT2)U{jHFut0UN;Bm1aUKcYlF!)A;T?le8lIuXs z2xjEup#bs+HdP|%s#F*>nf;1DWywoW*3o1x;$dK5xW$%OP>`CJa*Hjsq9iphMU%CN zpMim)NB}HXlv-SxQ*w(j^A=-PF~}BBih(8>UXU^n!N-%j5dDl^ru@F?Bj z;hiAZ>DKA^04l6HQ{xJcGE}(3@dGadHxIgjbNxQ>F|cyC`!@PcP?=CPLE{RG^bHm+ zFkf{B(*(^cEHXE^1si;e1Q{3@{4|-tB?ma67lE9 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