From a146c1a705cf4354e5842e69bbe3e822e963b6f2 Mon Sep 17 00:00:00 2001 From: mmaury2727 <120041871+mmaury2727@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:11:48 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Ajout=20Graphique=20+=20premi=C3=A8re=20que?= =?UTF-8?q?stion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .~lock.temps_exec_prog1.ods# | 1 + README.md | 2 +- sort/range.py | 19 +++++++++++++++++++ temps_exec_prog1.ods | Bin 0 -> 16187 bytes 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .~lock.temps_exec_prog1.ods# create mode 100644 temps_exec_prog1.ods diff --git a/.~lock.temps_exec_prog1.ods# b/.~lock.temps_exec_prog1.ods# new file mode 100644 index 0000000..eb6a726 --- /dev/null +++ b/.~lock.temps_exec_prog1.ods# @@ -0,0 +1 @@ +,DESKTOP-PMFVC5P/HP,DESKTOP-PMFVC5P,24.11.2023 12:09,file:///C:/Users/HP/AppData/Roaming/LibreOffice/4; \ No newline at end of file diff --git a/README.md b/README.md index 74f925a..2a72613 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 ? Malgré une précision assez mauvaise distingue une courbe semblante à O(n log n) diff --git a/sort/range.py b/sort/range.py index fc252ab..cf8ba97 100644 --- a/sort/range.py +++ b/sort/range.py @@ -1,2 +1,21 @@ +import time +import random + def generate_array_of_number(array_size: int) -> list[int]: + start: float = time.time() + array = [random.randint(0, 100) for i in range(array_size)] + end: float = time.time() + print("Taille du tableau = " , array_size) + print("Temps écoulé : ", end - start ) return [] + +generate_array_of_number(1000000) +generate_array_of_number(2000000) +generate_array_of_number(3000000) +generate_array_of_number(4000000) +generate_array_of_number(5000000) +generate_array_of_number(6000000) +generate_array_of_number(7000000) +generate_array_of_number(8000000) +generate_array_of_number(9000000) +generate_array_of_number(10000000) \ No newline at end of file diff --git a/temps_exec_prog1.ods b/temps_exec_prog1.ods new file mode 100644 index 0000000000000000000000000000000000000000..9dfb5cbf2e0dd02076d81ed9fa2e946e6bb6ea6f GIT binary patch literal 16187 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 z z`9?pYEe^IQtsH_<`TOckj@vg+s0+GXMjAzQ$9$%9t!c#rnqAG4&8hsMQ}*}D2U0WR zk>e2|UG+Tc^%PDzFqUele)Ef{rQhg?9Ys(BPQQONp^Tg0(}oKZMP2R`D|+*BkCS|X zz>4zDeGn342-6;hV~qh3xfhgFkqi83jLE4!2Zb;2i5%rF2lpo&^xfM=BJ*wLq963hwvT1U63eVuD^mrodh*>gFT3dbFPYI;1ZqB}9It z;%XvYLdOY~e^@;UTGq&(-v0*v)4PHo92>$VzXWaoTFTP{?XiaB#youO#3xVw8YKG7 z+V}Ut010piry9o2v~Hy(6WdCC%m^Kk)X(W9q&iHZDt+DgTa;EDMZ_W-97PPAq%@SI zam;DNQI%jwjU`!bj*fS0lZu}gAR8tR_iTtdCL)pPl!Zr}5Ha`Y4pWzhcCq_YA z1@MT3qW9=pr-(m>NH$$pTUc~ZunU`xzKxV&YT~#49Ic87k&FT`-O__nRgMCUM<(3fduXN@(t8C_=uSl-}_u)oU@~^I&qd^ zo;z_od95H(;i2q6^12(}IIkEryFsnP$mMw61Wzb|pM88Dv`nsn(c6{6%4rUOAzJ%+ z6Jkr`c=9C~5x++)Ga*>DzcRyIyA8etj68NmXXc?e2`L23;qz)YD^iaf8KH7(0TxOd z^uVyvW!rcyDk(iD1H<`6lhM@IM>it-8ENHj>&FgY)I$!vG$)y}KRg^f6ziVyKF6f7 z|5W(GGFW!?F2iOo@aF0|0s(7?Y)Dl~O-g@EfceOf>D?50IR(;#cPQZ+{4{b_A*A5C zG%K&**ih=pG9ACxmGUKX>vcGbA`$!*)mag=XMgt4R7q6Oq_S>wqtVt?XgU6Z%Zfkj z6WD8f%nt7+#t0MuP$l{mANwn|6WYrJ^-)AYfL2`k1O2~gPcJO;TE$LF975EV9cm?9 z*FyCDRHF4-gwju!vLZ!a?S$w0lS9CuBYU3iySQ+;Lug!RkKmlUM;K1TX=WFf73dLx zj&+1Eci{@!xn{LT*ylIa$}3Tq`=;|S#c0Bt8^ED!bN3ZC60qU4ATC>K*C1R{r+4ND z`um+k&p|uBllR919jq?dZ18o&R=YQ1IT}@^9buj*KBa+~lH!=hv6IL*NZpw=O-1lB zvJ3Ci)^wa0GQTp`VlIr9UwM` zN_{=VRCUx;Y1Fhl{CdB zNuAa3*`1JneMta|2~{LkUT~xlOU*v)TG$;I=l7&Oop`Ktvzm8og=j5N)#LVBK@N)PMX`25H^yhSz*Ic3B0{zn1U&)>S&K&x0^*^UOyym?8 z7VnpR=6|dIW|jRnz@IstuUQelB@^mT0Ds!C{DtrgN*#Yt@E2%`u8aRX&te@K>1Im>E9#0a!r4W&tD+@FXrjrgZ-zG+W!LV z&rH;R;rtqvf2LW!x{tr*`UU6TQ}hcn^;akUrTJ%O#_OiWZ((~G6@Nc`{=Db^%G>xY zyf60smGAf8wf%Yj<&_WcTX0@BPX1x6{rC3FZ^d4czu&C+@9O`&y#1${gqi=-=l*Za kKTo8u%inL=V*i`PP*xJ`Wg-Ir&|Y5FFX@uCoUf(-2d2D+i2wiq literal 0 HcmV?d00001 From 6e5c831709a9c3d1cb5e738fadb6a4862d09023d Mon Sep 17 00:00:00 2001 From: mmaury2727 <120041871+mmaury2727@users.noreply.github.com> Date: Sat, 25 Nov 2023 14:17:41 +0100 Subject: [PATCH 2/5] Algo Selection + 2e graphique --- .~lock.temps_exec_prog1.ods# | 1 - README.md | 4 +- sort/range.py | 32 +++++++++------- sort/selection.py | 70 +++++++++++++++++++++++++++++++++++ temps_exec_prog1.ods | Bin 16187 -> 24617 bytes 5 files changed, 91 insertions(+), 16 deletions(-) delete mode 100644 .~lock.temps_exec_prog1.ods# diff --git a/.~lock.temps_exec_prog1.ods# b/.~lock.temps_exec_prog1.ods# deleted file mode 100644 index eb6a726..0000000 --- a/.~lock.temps_exec_prog1.ods# +++ /dev/null @@ -1 +0,0 @@ -,DESKTOP-PMFVC5P/HP,DESKTOP-PMFVC5P,24.11.2023 12:09,file:///C:/Users/HP/AppData/Roaming/LibreOffice/4; \ No newline at end of file diff --git a/README.md b/README.md index 2a72613..7ebdb05 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 ? Malgré une précision assez mauvaise distingue une courbe semblante à O(n log n) +Comment vous semble évoluer la courbe ? Observez bien les différentes courbes du graphique ci-dessous. Quelle est la plus ressemblante à notre situation ? Malgré une précision assez mauvaise distingue une courbe semblante à O(n) @@ -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 ? Nous avons une variable à laquelle nous affectons la première valeur non triée de la liste, puis nous commençons à parcourir la liste, lorsque nous croisons une valeur plus petite que celle stockée dans notre variable nous l'affectons à notre variable jusqu'à arriver au bout de la liste, dès que nous y sommes arrivés nous plaçons l'élément à la suite des éléments triés, et ainsi de suite 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. diff --git a/sort/range.py b/sort/range.py index cf8ba97..812ba70 100644 --- a/sort/range.py +++ b/sort/range.py @@ -2,20 +2,26 @@ import random def generate_array_of_number(array_size: int) -> list[int]: - start: float = time.time() + """Génère une array de taille donnée en paramètre""" array = [random.randint(0, 100) for i in range(array_size)] + return array + +def time_to_generate_array(length: int): + """temps pour générer une array de taille passée en paramètre""" + start: float = time.time() + generate_array_of_number(length) end: float = time.time() - print("Taille du tableau = " , array_size) + print("Taille du tableau = " , length) print("Temps écoulé : ", end - start ) - return [] + -generate_array_of_number(1000000) -generate_array_of_number(2000000) -generate_array_of_number(3000000) -generate_array_of_number(4000000) -generate_array_of_number(5000000) -generate_array_of_number(6000000) -generate_array_of_number(7000000) -generate_array_of_number(8000000) -generate_array_of_number(9000000) -generate_array_of_number(10000000) \ No newline at end of file +# time_to_generate_array(1000000) +# time_to_generate_array(2000000) +# time_to_generate_array(3000000) +# time_to_generate_array(4000000) +# time_to_generate_array(5000000) +# time_to_generate_array(6000000) +# time_to_generate_array(7000000) +# time_to_generate_array(8000000) +# time_to_generate_array(9000000) +# time_to_generate_array(10000000) \ No newline at end of file diff --git a/sort/selection.py b/sort/selection.py index 73a21d3..4cbf29b 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -1,2 +1,72 @@ +import sys +import os + +# Chemin vers le répertoire racine du projet +project_path = 'C:\\Users\\HP\\Documents\\GitHub\\tp-python-algo-tri' + + +# Ajouter le chemin au PYTHONPATH +sys.path.append(project_path) + +import time +from sort.range import generate_array_of_number + def sort(array: list[int]) -> list[int]: + """Tri par sélection""" + + # On parcourt la liste une fois de moins que sa taille + for iteration in range(len(array) - 1): + + # On affecte la première valeur non triée à la variable smallest_number + smallest_number = array[iteration] + index_pop = iteration + + # On parcourt la liste pour trouver la plus petite valeur non triée + for iteration2 in range(iteration + 1, len(array)): + + if smallest_number > array[iteration2]: + + # Quand on trouve une valeur plus petite, on la stocke dans la variable + smallest_number = array[iteration2] + index_pop = iteration2 + + # On échange la plus petite valeur trouvée avec l'élément non trié actuel + array[index_pop], array[iteration] = array[iteration], array[index_pop] + + #print(array) return array + +def time_to_sort_selection(length: int): + array = generate_array_of_number(length) + start: float = time.time() + sort(array) + end: float = time.time() + print("Taille du tableau = " , length) + print("Temps écoulé : ", end - start ) + + + +time_to_sort_selection(1000) +time_to_sort_selection(2000) +time_to_sort_selection(3000) +time_to_sort_selection(4000) +time_to_sort_selection(5000) +time_to_sort_selection(6000) +time_to_sort_selection(7000) +time_to_sort_selection(8000) +time_to_sort_selection(9000) +time_to_sort_selection(10000) + +# array1 = [1, 3, 1, 4, 3, 4] +# array2 = [73, 16, 829, 2, 6] +# array3 = [-4, -282, 0, 7, 0] +# array4 = [1, 1, 1, 1, 1] +# array5 = [] +# array6 = [8] + +# sort(array1) +# sort(array2) +# sort(array3) +# sort(array4) +# sort(array5) +# sort(array6) diff --git a/temps_exec_prog1.ods b/temps_exec_prog1.ods index 9dfb5cbf2e0dd02076d81ed9fa2e946e6bb6ea6f..aa5d7e7e8311c3c046a874e4dca1b799df2da242 100644 GIT binary patch delta 21283 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 Date: Sat, 25 Nov 2023 15:18:00 +0100 Subject: [PATCH 3/5] Tri par insertion + Modif main + ajout 3e graphique --- .~lock.temps_exec_prog1.ods# | 1 + README.md | 4 +-- __main__.py | 29 +++++++++++++++++- sort/insertion.py | 57 +++++++++++++++++++++++++++++++++++ sort/selection.py | 10 ------ temps_exec_prog1.ods | Bin 24617 -> 27840 bytes 6 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 .~lock.temps_exec_prog1.ods# diff --git a/.~lock.temps_exec_prog1.ods# b/.~lock.temps_exec_prog1.ods# new file mode 100644 index 0000000..f017d83 --- /dev/null +++ b/.~lock.temps_exec_prog1.ods# @@ -0,0 +1 @@ +,DESKTOP-PMFVC5P/HP,DESKTOP-PMFVC5P,25.11.2023 15:09,file:///C:/Users/HP/AppData/Roaming/LibreOffice/4; \ No newline at end of file diff --git a/README.md b/README.md index 7ebdb05..c6d668e 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ 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é ? La complexité semble être O(n2²), cela semble logique par rapport au code implémenté, nous avons 2 boucles imbriquées. ### 2. Tri par insertion @@ -96,7 +96,7 @@ Observez attentivement l'animation de tri par insertion ci-dessous pour en compr -É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 de tri par insertion prend chaque élément de la liste un par un et les replaces dans le liste en les comparant à la partie déjà trié. Il ne bouge pas le premier élément car il n'y a pas encore de partie triée, puis il séléctionne le deuxième et le trie par rapport au premier, pour fait de même avec le troisième etc.... 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. diff --git a/__main__.py b/__main__.py index 98a585e..ec40558 100644 --- a/__main__.py +++ b/__main__.py @@ -1,5 +1,32 @@ +from sort.range import generate_array_of_number +from sort.selection import sort, time_to_sort_selection +from sort.insertion import sort, time_to_sort_insertion + def main(): - print("Hello world") + + print("---Temps Exec Tri Selection---") + time_to_sort_selection(1000) + time_to_sort_selection(2000) + time_to_sort_selection(3000) + time_to_sort_selection(4000) + time_to_sort_selection(5000) + time_to_sort_selection(6000) + time_to_sort_selection(7000) + time_to_sort_selection(8000) + time_to_sort_selection(9000) + time_to_sort_selection(10000) + + print("---Temps Exec Tri Insertion---") + time_to_sort_insertion(1000) + time_to_sort_insertion(2000) + time_to_sort_insertion(3000) + time_to_sort_insertion(4000) + time_to_sort_insertion(5000) + time_to_sort_insertion(6000) + time_to_sort_insertion(7000) + time_to_sort_insertion(8000) + time_to_sort_insertion(9000) + time_to_sort_insertion(10000) main() diff --git a/sort/insertion.py b/sort/insertion.py index 73a21d3..fffd066 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -1,2 +1,59 @@ +import time +from sort.range import generate_array_of_number + def sort(array: list[int]) -> list[int]: + """Tri par insertion""" + + # On lance une boucle for qui prendra chaque élément 1 par 1 pour les trier + # On commence à 1 car 0 est déjà trié + for item_to_sort in range (1, len(array)): + + # la variable item_to_test aura pour but de tester les éléments placés + # avant l'élément que nous voulons trier + item_to_test = item_to_sort - 1 + current_item = array[item_to_sort] + # Puis on lance une boucle while qui " déplacera " notre élément tant + # qu'il n'est pas à la bonne place + while array[item_to_sort] < array[item_to_test] and item_to_test >= 0: + # On décales les éléments car nous ne voulons pas insérer notre + # élément ici + array[item_to_test + 1] = array[item_to_test] + item_to_test -= 1 + array[item_to_test + 1] = current_item return array + +def time_to_sort_insertion(length: int): + """Temps pour trier un tableau d'une taille donnnée en paramètre avec le + tri par instertion""" + array = generate_array_of_number(length) + start: float = time.time() + sort(array) + end: float = time.time() + print("Taille du tableau = " , length) + print("Temps écoulé : ", end - start ) + +time_to_sort_insertion(1000) +time_to_sort_insertion(2000) +time_to_sort_insertion(3000) +time_to_sort_insertion(4000) +time_to_sort_insertion(5000) +time_to_sort_insertion(6000) +time_to_sort_insertion(7000) +time_to_sort_insertion(8000) +time_to_sort_insertion(9000) +time_to_sort_insertion(10000) + + +# array1 = [1, 3, 1, 4, 3, 4] +# array2 = [73, 16, 829, 2, 6] +# array3 = [-4, -282, 0, 7, 0] +# array4 = [1, 1, 1, 1, 1] +# array5 = [] +# array6 = [8] + +# sort(array1) +# sort(array2) +# sort(array3) +# sort(array4) +# sort(array5) +# sort(array6) \ No newline at end of file diff --git a/sort/selection.py b/sort/selection.py index 4cbf29b..4c2802b 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -1,13 +1,3 @@ -import sys -import os - -# Chemin vers le répertoire racine du projet -project_path = 'C:\\Users\\HP\\Documents\\GitHub\\tp-python-algo-tri' - - -# Ajouter le chemin au PYTHONPATH -sys.path.append(project_path) - import time from sort.range import generate_array_of_number diff --git a/temps_exec_prog1.ods b/temps_exec_prog1.ods index aa5d7e7e8311c3c046a874e4dca1b799df2da242..d20c6e85d856ad90a59484b8160ba7b8dc1e0b50 100644 GIT binary patch delta 12631 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 Date: Sat, 25 Nov 2023 15:34:07 +0100 Subject: [PATCH 4/5] Modif pycodestyle + factorielle --- README.md | 2 +- __main__.py | 15 ++++++++++++++- sort/insertion.py | 26 -------------------------- sort/range.py | 12 ------------ sort/recursion.py | 8 +++++++- sort/selection.py | 29 ++--------------------------- 6 files changed, 24 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index c6d668e..f7aa81e 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ 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é ? Ici la complexié est difficile à distinguer, on pourrait imaginer un complexité O(log n) mais cela n'est pas logique par rapport au code implémenté nous aurions dû trouver une complexité semblable à O(n²). ### 3. Tri par fusion diff --git a/__main__.py b/__main__.py index ec40558..6f436be 100644 --- a/__main__.py +++ b/__main__.py @@ -1,8 +1,21 @@ -from sort.range import generate_array_of_number +from sort.range import generate_array_of_number, time_to_generate_array from sort.selection import sort, time_to_sort_selection from sort.insertion import sort, time_to_sort_insertion def main(): + """Fonction principle, ici permettra de tester l'efficacité des algos""" + + print("---Temps Exec Génération Tableau---") + time_to_generate_array(1000000) + time_to_generate_array(2000000) + time_to_generate_array(3000000) + time_to_generate_array(4000000) + time_to_generate_array(5000000) + time_to_generate_array(6000000) + time_to_generate_array(7000000) + time_to_generate_array(8000000) + time_to_generate_array(9000000) + time_to_generate_array(10000000) print("---Temps Exec Tri Selection---") time_to_sort_selection(1000) diff --git a/sort/insertion.py b/sort/insertion.py index fffd066..7fd39fe 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -31,29 +31,3 @@ def time_to_sort_insertion(length: int): end: float = time.time() print("Taille du tableau = " , length) print("Temps écoulé : ", end - start ) - -time_to_sort_insertion(1000) -time_to_sort_insertion(2000) -time_to_sort_insertion(3000) -time_to_sort_insertion(4000) -time_to_sort_insertion(5000) -time_to_sort_insertion(6000) -time_to_sort_insertion(7000) -time_to_sort_insertion(8000) -time_to_sort_insertion(9000) -time_to_sort_insertion(10000) - - -# array1 = [1, 3, 1, 4, 3, 4] -# array2 = [73, 16, 829, 2, 6] -# array3 = [-4, -282, 0, 7, 0] -# array4 = [1, 1, 1, 1, 1] -# array5 = [] -# array6 = [8] - -# sort(array1) -# sort(array2) -# sort(array3) -# sort(array4) -# sort(array5) -# sort(array6) \ No newline at end of file diff --git a/sort/range.py b/sort/range.py index 812ba70..5a8c20d 100644 --- a/sort/range.py +++ b/sort/range.py @@ -13,15 +13,3 @@ def time_to_generate_array(length: int): end: float = time.time() print("Taille du tableau = " , length) print("Temps écoulé : ", end - start ) - - -# time_to_generate_array(1000000) -# time_to_generate_array(2000000) -# time_to_generate_array(3000000) -# time_to_generate_array(4000000) -# time_to_generate_array(5000000) -# time_to_generate_array(6000000) -# time_to_generate_array(7000000) -# time_to_generate_array(8000000) -# time_to_generate_array(9000000) -# time_to_generate_array(10000000) \ No newline at end of file diff --git a/sort/recursion.py b/sort/recursion.py index e7f4320..754d166 100644 --- a/sort/recursion.py +++ b/sort/recursion.py @@ -1,2 +1,8 @@ def get_factorial(number: int) -> int: - return number + """Retoune la factorielle de manière recursive""" + # On test le cas de factotrielle de 0 + if number == 0: + return 1 + # Sinon on calcule la factorille récursivement + else: + return number * get_factorial(number - 1) diff --git a/sort/selection.py b/sort/selection.py index 4c2802b..1ddcce5 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -27,36 +27,11 @@ def sort(array: list[int]) -> list[int]: return array def time_to_sort_selection(length: int): + """Temps pour trier un tableau d'une taille donnnée en paramètre avec le + tri par selection""" array = generate_array_of_number(length) start: float = time.time() sort(array) end: float = time.time() print("Taille du tableau = " , length) print("Temps écoulé : ", end - start ) - - - -time_to_sort_selection(1000) -time_to_sort_selection(2000) -time_to_sort_selection(3000) -time_to_sort_selection(4000) -time_to_sort_selection(5000) -time_to_sort_selection(6000) -time_to_sort_selection(7000) -time_to_sort_selection(8000) -time_to_sort_selection(9000) -time_to_sort_selection(10000) - -# array1 = [1, 3, 1, 4, 3, 4] -# array2 = [73, 16, 829, 2, 6] -# array3 = [-4, -282, 0, 7, 0] -# array4 = [1, 1, 1, 1, 1] -# array5 = [] -# array6 = [8] - -# sort(array1) -# sort(array2) -# sort(array3) -# sort(array4) -# sort(array5) -# sort(array6) From b3040cbec7975dc5ccad92f7bc238d38e7c1e35d Mon Sep 17 00:00:00 2001 From: mmaury2727 <120041871+mmaury2727@users.noreply.github.com> Date: Sat, 25 Nov 2023 17:48:35 +0100 Subject: [PATCH 5/5] =?UTF-8?q?Les=20tests=20passent,=20pas=20d'erreur=20p?= =?UTF-8?q?ycodestyle,=20un=20code=20comment=C3=A9=20=C3=A0=20souhait=20qu?= =?UTF-8?q?e=20demander=20de=20plus=20=C3=A0=20part=20peu=20=C3=AAtre=20un?= =?UTF-8?q?=20message=20de=20commit=20plus=20court?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .~lock.temps_exec_prog1.ods# | 2 +- README.md | 12 ++-- __main__.py | 119 +++++++++++++++++++++++------------ sort/fusion.py | 69 +++++++++++++++++++- sort/insertion.py | 43 +++++++------ sort/range.py | 6 +- sort/selection.py | 13 ++-- temps_exec_prog1.ods | Bin 27840 -> 32034 bytes 8 files changed, 191 insertions(+), 73 deletions(-) diff --git a/.~lock.temps_exec_prog1.ods# b/.~lock.temps_exec_prog1.ods# index f017d83..06868bc 100644 --- a/.~lock.temps_exec_prog1.ods# +++ b/.~lock.temps_exec_prog1.ods# @@ -1 +1 @@ -,DESKTOP-PMFVC5P/HP,DESKTOP-PMFVC5P,25.11.2023 15:09,file:///C:/Users/HP/AppData/Roaming/LibreOffice/4; \ No newline at end of file +,DESKTOP-PMFVC5P/HP,DESKTOP-PMFVC5P,25.11.2023 17:47,file:///C:/Users/HP/AppData/Roaming/LibreOffice/4; \ No newline at end of file diff --git a/README.md b/README.md index f7aa81e..65d8049 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ 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é ? Ici la complexié est difficile à distinguer, on pourrait imaginer un complexité O(log n) mais cela n'est pas logique par rapport au code implémenté nous aurions dû trouver une complexité semblable à O(n²). +Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ? De la même manière que pour le tri par selection nous avons un programme qui imbrique 2 boucles, nous devrions donc retrouver un complexité de 0( n² ) et c'est bel et bien ce que le grahique nous retransmet ### 3. Tri par fusion @@ -154,7 +154,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 ? Nous divisons un tableau en 2 puis nous divisons ces 2 nouveaux tableaux en 4 et ce jusqu'à obtenir des tableaux de taille 1, après tout avoir divisé nous devons les réassembler mais cette fois ci dans le bon ordre, chaque membre s'assemble avec son membre de gauche ou droite pour former un tableau trié et ainsi de suite jusqu'à revenir à seul tableau mais cette fois ci, trié Complétez la fonction `sort` du fichier `sort/fusion.py` en suivant les instructions suivantes. @@ -174,15 +174,17 @@ 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é ? La complexité semble être O ( n log n ), nous avons un algorithme de division récursive donc cela paraît logique -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 ? Les tailles de tableau très petite sont défavorables pour le tri fusion ### 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 ;) + +Nos algos sont bien moins rapide que le sort de python ## Pour rendre ce TP diff --git a/__main__.py b/__main__.py index 6f436be..62cd098 100644 --- a/__main__.py +++ b/__main__.py @@ -1,45 +1,84 @@ -from sort.range import generate_array_of_number, time_to_generate_array -from sort.selection import sort, time_to_sort_selection -from sort.insertion import sort, time_to_sort_insertion +from sort.range import time_to_generate_array, generate_array_of_number +from sort.selection import time_to_sort_selection +from sort.insertion import time_to_sort_insertion +from sort.fusion import time_to_sort_fusion +import time + def main(): - """Fonction principle, ici permettra de tester l'efficacité des algos""" - - print("---Temps Exec Génération Tableau---") - time_to_generate_array(1000000) - time_to_generate_array(2000000) - time_to_generate_array(3000000) - time_to_generate_array(4000000) - time_to_generate_array(5000000) - time_to_generate_array(6000000) - time_to_generate_array(7000000) - time_to_generate_array(8000000) - time_to_generate_array(9000000) - time_to_generate_array(10000000) - - print("---Temps Exec Tri Selection---") - time_to_sort_selection(1000) - time_to_sort_selection(2000) - time_to_sort_selection(3000) - time_to_sort_selection(4000) - time_to_sort_selection(5000) - time_to_sort_selection(6000) - time_to_sort_selection(7000) - time_to_sort_selection(8000) - time_to_sort_selection(9000) - time_to_sort_selection(10000) - - print("---Temps Exec Tri Insertion---") - time_to_sort_insertion(1000) - time_to_sort_insertion(2000) - time_to_sort_insertion(3000) - time_to_sort_insertion(4000) - time_to_sort_insertion(5000) - time_to_sort_insertion(6000) - time_to_sort_insertion(7000) - time_to_sort_insertion(8000) - time_to_sort_insertion(9000) - time_to_sort_insertion(10000) + """Fonction principale, ici permettra de tester l'efficacité des algos""" + + # print("---Temps Exec Génération Tableau---") + # time_to_generate_array(1000000) + # time_to_generate_array(2000000) + # time_to_generate_array(3000000) + # time_to_generate_array(4000000) + # time_to_generate_array(5000000) + # time_to_generate_array(6000000) + # time_to_generate_array(7000000) + # time_to_generate_array(8000000) + # time_to_generate_array(9000000) + # time_to_generate_array(10000000) + + # print("---Temps Exec Tri Selection---") + # time_to_sort_selection(1000) + # time_to_sort_selection(2000) + # time_to_sort_selection(3000) + # time_to_sort_selection(4000) + # time_to_sort_selection(5000) + # time_to_sort_selection(6000) + # time_to_sort_selection(7000) + # time_to_sort_selection(8000) + # time_to_sort_selection(9000) + # time_to_sort_selection(10000) + + # print("---Temps Exec Tri Insertion---") + # time_to_sort_insertion(1000) + # time_to_sort_insertion(2000) + # time_to_sort_insertion(3000) + # time_to_sort_insertion(4000) + # time_to_sort_insertion(5000) + # time_to_sort_insertion(6000) + # time_to_sort_insertion(7000) + # time_to_sort_insertion(8000) + # time_to_sort_insertion(9000) + # time_to_sort_insertion(10000) + + # print("---Temps Exec Tri Fusion---") + # time_to_sort_fusion(1000) + # time_to_sort_fusion(2000) + # time_to_sort_fusion(3000) + # time_to_sort_fusion(4000) + # time_to_sort_fusion(5000) + # time_to_sort_fusion(6000) + # time_to_sort_fusion(7000) + # time_to_sort_fusion(8000) + # time_to_sort_fusion(9000) + # time_to_sort_fusion(10000) + + print("---Temps Exec Sort By Python---") + time_to_sort_by_pyhton(1000) + time_to_sort_by_pyhton(2000) + time_to_sort_by_pyhton(3000) + time_to_sort_by_pyhton(4000) + time_to_sort_by_pyhton(5000) + time_to_sort_by_pyhton(6000) + time_to_sort_by_pyhton(7000) + time_to_sort_by_pyhton(8000) + time_to_sort_by_pyhton(9000) + time_to_sort_by_pyhton(10000) + time_to_sort_by_pyhton(999999) + + +def time_to_sort_by_pyhton(length: int): + """Temps pour trier un tableau d'une taille donnnée en paramètre avec le + tri par selection""" + array = generate_array_of_number(length) + start: float = time.time() + array.sort() + end: float = time.time() + print("Taille du tableau = ", length) + print("Temps écoulé : ", end - start) main() diff --git a/sort/fusion.py b/sort/fusion.py index 73a21d3..658bfb6 100644 --- a/sort/fusion.py +++ b/sort/fusion.py @@ -1,2 +1,69 @@ +import time +from sort.range import generate_array_of_number + + def sort(array: list[int]) -> list[int]: - return array + """Divise le tableau pour le trier plus facilement.""" + if len(array) <= 1: + return array + + # On cherche le milieu pour séparer le tableau en 2 parties de même taille + # (ou presque si impair, grâce à la division entière) + center = len(array) // 2 + + # On copie les sous-tableaux + array_split_1 = array[:center] + array_split_2 = array[center:] + + # On continue de manière récursive de diviser notre tableau + sorted_array_1 = sort(array_split_1) + sorted_array_2 = sort(array_split_2) + + # Puis on renvoie la fusion de nos tableaux triés + return merge(sorted_array_1, sorted_array_2) + + +def merge(array1: list[int], array2: list[int]) -> list[int]: + """Combine des tableaux triés.""" + temp_array = [] + index_1 = 0 + index_2 = 0 + + while index_1 < len(array1) and index_2 < len(array2): + if array1[index_1] < array2[index_2]: + temp_array.append(array1[index_1]) + index_1 += 1 + else: + temp_array.append(array2[index_2]) + index_2 += 1 + + # Ajoute les éléments restants s'il y en a dans array1 + while index_1 < len(array1): + temp_array.append(array1[index_1]) + index_1 += 1 + + # Ajoute les éléments restants s'il y en a dans array2 + while index_2 < len(array2): + temp_array.append(array2[index_2]) + index_2 += 1 + + # Crée un nouvel array pour stocker le résultat fusionné + merged_array = [0] * (len(array1) + len(array2)) + + # Copie les éléments de temp_array dans merged_array + # ( pylint m'a consillé cette syntaxe elle est pas mal je connaissais pas ) + for i, value in enumerate(temp_array): + merged_array[i] = value + + return merged_array + + +def time_to_sort_fusion(length: int): + """Temps pour trier un tableau d'une taille donnée en paramètre avec le + tri par insertion.""" + array = generate_array_of_number(length) + start_time = time.time() + sort(array) + end_time = time.time() + print("Taille du tableau =", length) + print("Temps écoulé :", end_time - start_time) diff --git a/sort/insertion.py b/sort/insertion.py index 7fd39fe..a0ea192 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -1,33 +1,38 @@ import time from sort.range import generate_array_of_number + def sort(array: list[int]) -> list[int]: - """Tri par insertion""" - - # On lance une boucle for qui prendra chaque élément 1 par 1 pour les trier - # On commence à 1 car 0 est déjà trié - for item_to_sort in range (1, len(array)): - - # la variable item_to_test aura pour but de tester les éléments placés - # avant l'élément que nous voulons trier + """Tri par insertion.""" + + # On lance une boucle for qui prendra chaque élément un par un pour les + # trier. On commence à 1 car 0 est déjà trié. + for item_to_sort in range(1, len(array)): + + # La variable item_to_test aura pour but de tester les éléments placés + # avant l'élément que nous voulons trier. item_to_test = item_to_sort - 1 current_item = array[item_to_sort] - # Puis on lance une boucle while qui " déplacera " notre élément tant - # qu'il n'est pas à la bonne place - while array[item_to_sort] < array[item_to_test] and item_to_test >= 0: - # On décales les éléments car nous ne voulons pas insérer notre - # élément ici + + # Puis on lance une boucle while qui "déplacera" notre élément tant + # qu'il n'est pas à la bonne place. + while current_item < array[item_to_test] and item_to_test >= 0: + # On décale les éléments car nous ne voulons pas insérer notre + # élément ici. array[item_to_test + 1] = array[item_to_test] item_to_test -= 1 + array[item_to_test + 1] = current_item + return array + def time_to_sort_insertion(length: int): - """Temps pour trier un tableau d'une taille donnnée en paramètre avec le - tri par instertion""" + """Temps pour trier un tableau d'une taille donnée en paramètre avec le + tri par insertion.""" array = generate_array_of_number(length) - start: float = time.time() + start_time = time.time() sort(array) - end: float = time.time() - print("Taille du tableau = " , length) - print("Temps écoulé : ", end - start ) + end_time = time.time() + print("Taille du tableau =", length) + print("Temps écoulé :", end_time - start_time) diff --git a/sort/range.py b/sort/range.py index 5a8c20d..99f1ecc 100644 --- a/sort/range.py +++ b/sort/range.py @@ -1,15 +1,17 @@ import time import random + def generate_array_of_number(array_size: int) -> list[int]: """Génère une array de taille donnée en paramètre""" array = [random.randint(0, 100) for i in range(array_size)] return array + def time_to_generate_array(length: int): """temps pour générer une array de taille passée en paramètre""" start: float = time.time() generate_array_of_number(length) end: float = time.time() - print("Taille du tableau = " , length) - print("Temps écoulé : ", end - start ) + print("Taille du tableau = ", length) + print("Temps écoulé : ", end - start) diff --git a/sort/selection.py b/sort/selection.py index 1ddcce5..517a9c7 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -1,6 +1,7 @@ import time from sort.range import generate_array_of_number + def sort(array: list[int]) -> list[int]: """Tri par sélection""" @@ -16,16 +17,18 @@ def sort(array: list[int]) -> list[int]: if smallest_number > array[iteration2]: - # Quand on trouve une valeur plus petite, on la stocke dans la variable + # Quand on trouve une valeur plus petite, + # on la stocke dans la variable smallest_number = array[iteration2] index_pop = iteration2 - # On échange la plus petite valeur trouvée avec l'élément non trié actuel + # On échange la plus petite valeur trouvée avec + # l'élément non trié actuel array[index_pop], array[iteration] = array[iteration], array[index_pop] - #print(array) return array + def time_to_sort_selection(length: int): """Temps pour trier un tableau d'une taille donnnée en paramètre avec le tri par selection""" @@ -33,5 +36,5 @@ def time_to_sort_selection(length: int): start: float = time.time() sort(array) end: float = time.time() - print("Taille du tableau = " , length) - print("Temps écoulé : ", end - start ) + print("Taille du tableau = ", length) + print("Temps écoulé : ", end - start) diff --git a/temps_exec_prog1.ods b/temps_exec_prog1.ods index d20c6e85d856ad90a59484b8160ba7b8dc1e0b50..d53063d70d923dbd2ec7ff8b77b027b2bfa15fa8 100644 GIT binary patch delta 21297 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