From 6af4dbe30e19c93d3c4217b6d2ebe5389c2b42da Mon Sep 17 00:00:00 2001 From: The17thDoctor <40616434+The17thDoctor@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:04:51 +0100 Subject: [PATCH 1/5] Rajouts de tous les algos (pourquoi le fusion sort est bizarre ? :thinking:) --- README.md | 33 ++++++++++++++++++++++++++---- __main__.py | 14 ++++++++++++- img/insertion_exectime.png | Bin 0 -> 17286 bytes img/selection_exectime.png | Bin 0 -> 19052 bytes sort/fusion.py | 40 ++++++++++++++++++++++++++++++++++++- sort/insertion.py | 24 ++++++++++++++++++++++ sort/range.py | 5 ++++- sort/recursion.py | 5 ++++- sort/selection.py | 18 +++++++++++++++++ 9 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 img/insertion_exectime.png create mode 100644 img/selection_exectime.png diff --git a/README.md b/README.md index 74f925a..734d2a0 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ Sur un tableur, générez un tableau permettant de visualiser le temps d'éxécu 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* +Après des tests en générant des tableaux de 1M à 10M d'éléments, la croissance du temps de calcul semble évoluer +de manière linéaire (O(n)). + #### Quelques exemples de complexités courante : @@ -75,7 +78,13 @@ 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'algorithme semble commencer au début du tableau. A chaque itération, l'algorithme va comparer le nombre actuel au plus petit +trouvé précédemment et ce jusqu'à atteindre la fin du tableau. Lorsque l'algorithme arrive à la fin du tableau, il échange le plus petit nombre trouvé +avec la position du premier nombre considéré comme "non trié". Il incrémente ensuite la position du début des nombres non triés et recommence à partir de la. + 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. @@ -88,7 +97,13 @@ 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é de l'algorithme par sélection semble être de O(N²), cela semble être logique car au mieux le tableau est déjà trié, au pire il faut accéder au tableau n + n-1 + n-2 + ... fois, ce qui est très long. + ### 2. Tri par insertion @@ -96,7 +111,11 @@ 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 commence au début du tableau. Pour chaque nombre, il regarde si le nombre derrière lui est supérieur. (Ou ne fait rien pour la première itération). Si le nombre derrière est plus grand, il continue avec le nombre encore derrière jusqu'à ce que le nombre soit inférieur, auquel cas il insère le nombre juste après lui. Il marque ce nombre comme "rangé" et passe au nombre non rangé suivant. + 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. @@ -109,7 +128,13 @@ 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é de l'algorithme par sélection semble être de O(N²), cela semble être logique car au mieux chaque élément est trié et donc il n'y a aucun déplacement, au pire chaque élément inséré est inséré au tout début du tableau, ce qui peut être très long. + ### 3. Tri par fusion diff --git a/__main__.py b/__main__.py index 98a585e..a65f579 100644 --- a/__main__.py +++ b/__main__.py @@ -1,5 +1,17 @@ +import sort.range as srange +import sort.selection as selection +import sort.insertion as insertion +import sort.fusion as fusion +import time + + def main(): - print("Hello world") + for i in range(10000): + array: list[int] = srange.generate_array_of_number(i) + start: float = time.time() + print(fusion.sort(array) == sorted(array)) + end: float = time.time() + print(str(end - start).replace(".", ",")) main() diff --git a/img/insertion_exectime.png b/img/insertion_exectime.png new file mode 100644 index 0000000000000000000000000000000000000000..30cdcd925bd7ae351ff9f632b2e60b7414886989 GIT binary patch literal 17286 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 B51#-4 literal 0 HcmV?d00001 diff --git a/img/selection_exectime.png b/img/selection_exectime.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e3557b4802c4cd51c30a179dc28efc8eb3ab3e GIT binary patch literal 19052 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 F{|jm_hIRk| literal 0 HcmV?d00001 diff --git a/sort/fusion.py b/sort/fusion.py index 73a21d3..1caf27a 100644 --- a/sort/fusion.py +++ b/sort/fusion.py @@ -1,2 +1,40 @@ def sort(array: list[int]) -> list[int]: - return array + # Arrays of size 0/1 are already sorted. + if len(array) < 2: + return array + + if len(array) > 2: + # Split and merge sorted + middle: int = len(array) // 2 + 1 + return merge(sort(array[:middle]), sort(array[middle:])) + else: + # For array of size 2, just swap if needed + return [array[1], array[0]] if array[1] < array[0] else array + + +def merge(array_1: list[int], array_2: list[int]): + final_array: list[int] = [] + index_1: int = 0 + index_2: int = 0 + len_1: int = len(array_1) + len_2: int = len(array_2) + + for i in range(len_1 + len_2): + # If either list is empty, that means the other list is the end of + # the final array + if index_1 == len_1: + final_array += array_2[index_2:] + break + elif index_2 == len_2: + final_array += array_1[index_1:] + break + + # Append the smallest value of either list. + if array_1[index_1] < array_2[index_2]: + final_array.append(array_1[index_1]) + index_1 += 1 + else: + final_array.append(array_2[index_2]) + index_2 += 1 + + return final_array diff --git a/sort/insertion.py b/sort/insertion.py index 73a21d3..4c95e13 100644 --- a/sort/insertion.py +++ b/sort/insertion.py @@ -1,2 +1,26 @@ def sort(array: list[int]) -> list[int]: + """Sorts the array using the insertion sort method.""" + # Arrays of size 0/1 are already sorted. + if len(array) < 2: + return array + + array_length: int = len(array) + + for i in range(array_length): + # Skip first + if i == 0: + continue + + # Main logic loop + new_index = i + while new_index > 0: + if array[new_index - 1] < array[i]: + break + + new_index -= 1 + + # Insert value right after the first number less than it + value_to_insert = array.pop(i) + array.insert(new_index, value_to_insert) + return array diff --git a/sort/range.py b/sort/range.py index fc252ab..703704a 100644 --- a/sort/range.py +++ b/sort/range.py @@ -1,2 +1,5 @@ +import random + + def generate_array_of_number(array_size: int) -> list[int]: - return [] + return [random.randint(0, 100) for i in range(array_size)] diff --git a/sort/recursion.py b/sort/recursion.py index e7f4320..ef748ba 100644 --- a/sort/recursion.py +++ b/sort/recursion.py @@ -1,2 +1,5 @@ def get_factorial(number: int) -> int: - return number + if number > 1: + return number * get_factorial(number - 1) + else: + return 1 diff --git a/sort/selection.py b/sort/selection.py index 73a21d3..2a0e7cd 100644 --- a/sort/selection.py +++ b/sort/selection.py @@ -1,2 +1,20 @@ def sort(array: list[int]) -> list[int]: + """Sorts the given array using the selection sort method.""" + # Arrays of size 0/1 are already sorted. + if len(array) < 2: + return array + + array_length: int = len(array) + + for i in range(array_length - 1): + # Sorting iteration loop + min_index: int = i + for j in range(i, array_length): + min_index = j if array[j] < array[min_index] else min_index + + # If the current index is already sorted, do nothing. + if min_index != i: + # Swap the minimum and current numbers + array[i], array[min_index] = array[min_index], array[i] + return array From e7dbfdc4ad37346da39e5599c8a21e7c22983f9e Mon Sep 17 00:00:00 2001 From: The17thDoctor <40616434+The17thDoctor@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:38:01 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Algos=20termin=C3=A9s=20+=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++-- __main__.py | 20 ++++++++++++++++++-- img/fusion_exectime.png | Bin 0 -> 20606 bytes 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 img/fusion_exectime.png diff --git a/README.md b/README.md index 734d2a0..bafc05b 100644 --- a/README.md +++ b/README.md @@ -199,9 +199,20 @@ 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* + -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* +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é (malgré les apparences) est de O(n log n). Cela est logique car contrairement aux algorithmes précédents, il n'y a pas +d'imbrication de boucle. + + +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 ? +
+ +Sachant que la complexité des algorithmes précédents est n² et que la complexité actuelle est de n\*log(n), le tri par fusion sera toujours plus rapide car pour n'importe quelle valeur de n supérieur à 0, n\*log(n) < n². + ### 4. sort() diff --git a/__main__.py b/__main__.py index a65f579..d4ec2cb 100644 --- a/__main__.py +++ b/__main__.py @@ -6,10 +6,26 @@ def main(): - for i in range(10000): + """This is the main function !""" + + """for i in range(10000, 100000, 10000): + array: list[int] = srange.generate_array_of_number(i) + start: float = time.time() + selection.sort(array) + end: float = time.time() + print(str(end - start).replace(".", ","))""" + + """for i in range(10000, 100000, 10000): + array: list[int] = srange.generate_array_of_number(i) + start: float = time.time() + insertion.sort(array) + end: float = time.time() + print(str(end - start).replace(".", ","))""" + + for i in range(100000, 1000000, 100000): array: list[int] = srange.generate_array_of_number(i) start: float = time.time() - print(fusion.sort(array) == sorted(array)) + fusion.sort(array) end: float = time.time() print(str(end - start).replace(".", ",")) diff --git a/img/fusion_exectime.png b/img/fusion_exectime.png new file mode 100644 index 0000000000000000000000000000000000000000..adb51b870f411b3db38c284bd5763b26cadf1398 GIT binary patch literal 20606 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%0DQ0VYf3YX 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 b Date: Fri, 17 Nov 2023 16:15:22 +0100 Subject: [PATCH 3/5] Rajout explication fusion sort --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bafc05b..e14722d 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,11 @@ 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 ? +
+ +L'algorithme utilise la méthode dite dichotomique (divier pour régner). Il commence par diviser le tableau en deux autant de fois que nécéssaire afin d'arriver à une seule valeur par tableau. L'algorithme fusionne ensuite les deux tableaux en comparant les deux et en insérant les valeurs des deux tableaux en ordre croissant. + Complétez la fonction `sort` du fichier `sort/fusion.py` en suivant les instructions suivantes. From 618f2029700a2c89cfe0c4057bc742771b246820 Mon Sep 17 00:00:00 2001 From: The17thDoctor <40616434+The17thDoctor@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:51:13 +0100 Subject: [PATCH 4/5] =?UTF-8?q?Oubli=20r=C3=A9ponse=20sort()=20python=20+?= =?UTF-8?q?=20graphique=20de=20temps=20d'ex=C3=A9cution=20pour=20la=20cr?= =?UTF-8?q?=C3=A9ation=20des=20arrays?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++++++++- __main__.py | 20 +++++++++++++++++++- img/array_exectime.png | Bin 0 -> 18684 bytes img/python_exectime.png | Bin 0 -> 21170 bytes 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 img/array_exectime.png create mode 100644 img/python_exectime.png diff --git a/README.md b/README.md index e14722d..5c846bf 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,9 @@ 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 ? Après des tests en générant des tableaux de 1M à 10M d'éléments, la croissance du temps de calcul semble évoluer de manière linéaire (O(n)). @@ -224,6 +226,15 @@ Bien que tout cela soit fascinant, Python possède sa propre méthode de tri : ` Une dernière fois, analysez le temps d'exécution et découvrez si python fait mieux que nos implémentations rudimentaires ;) + + + +Python semble faire mieux que nous, le temps d'exécution comparé au Fusion Sort est plus rapide d'un facteur 100 ! +Pour une même taille de tableau, le sort natif de python met 100x moins de temps que notre fusion sort. +
+La complexité de l'algorithme implémenté par python semble être 0(n). +
+ ## Pour rendre ce TP Merci de faire une Pull Request vers ce repository. diff --git a/__main__.py b/__main__.py index d4ec2cb..be849bb 100644 --- a/__main__.py +++ b/__main__.py @@ -8,6 +8,14 @@ def main(): """This is the main function !""" + # Array Generation + """for i in range(1000000, 1100000, 100000): + start: float = time.time() + array: list[int] = srange.generate_array_of_number(i) + end: float = time.time() + print(str(end - start).replace(".", ","))""" + + # Selection Sort """for i in range(10000, 100000, 10000): array: list[int] = srange.generate_array_of_number(i) start: float = time.time() @@ -15,6 +23,7 @@ def main(): end: float = time.time() print(str(end - start).replace(".", ","))""" + # Insertion Sort """for i in range(10000, 100000, 10000): array: list[int] = srange.generate_array_of_number(i) start: float = time.time() @@ -22,11 +31,20 @@ def main(): end: float = time.time() print(str(end - start).replace(".", ","))""" - for i in range(100000, 1000000, 100000): + # Fusion Sort + """for i in range(100000, 3100000, 100000): array: list[int] = srange.generate_array_of_number(i) start: float = time.time() fusion.sort(array) end: float = time.time() + print(str(end - start).replace(".", ","))""" + + # Python Sort + for i in range(100000, 3100000, 100000): + array: list[int] = srange.generate_array_of_number(i) + start: float = time.time() + array.sort() + end: float = time.time() print(str(end - start).replace(".", ",")) diff --git a/img/array_exectime.png b/img/array_exectime.png new file mode 100644 index 0000000000000000000000000000000000000000..36959f94e7616eecc17d4bb1eaa21e9272afeb1b GIT binary patch literal 18684 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 >^2WEB+DjP8Q>{T|E)= zll}`$xmut~&`4&EvR8Xo05f2`9; zj&jh5PC}{fP~pg7h-U1-rk;(D#qs&UnW2YPNBP4R%&MIh2gYS5Gr#|Bud?EMbiK&l z?N3ql{Gte2f^kHmoacu`4G}eP%R)Mg!#2)!t6ux#G}#eZ-_faPu=6`3HT=-ZY;a-T z_q_fC;Gz(=$v@YB^yxv!Wt$$`waEsq)poIoJl8nZxxS*R_TbVt*VYb(aQnTnY;g#m zgBC1TaW|38!Zltqv*U)URZ4$Q$w4v`sfd-Oj1OmiD%v7Zss@p!q%dkoMqHG6iJd#GQfK}Iq~$F2Y1rqqZ9$6 zY4d#cECpVwAsX}H%vhY9r&o8Z=`xiTV@tUu@cOiEzasC|FN>w&-buZ9{cpncdOUeh}`Oa6zjjVu!lBnb$DD$ta;6{?Dg->_Z3aq zvT=MIE5Bc_y)^qkDj$`t+}S$mD~+pJ8m)90I$i?`6N(k`H~QQWNdynJzk>m$(QT5_ zvDdl2z8IN1M-tjhc8hzb(^m~9tp2W>HX7-rRVfQ!TFgXTN*UPv+g@arTQU}m+k4t+ zu{Wwi4eyYAp{{6;MsjD+TTc3BO782`x2492B5b}Qk7_B7qSI_@ov_h$_JGOEY&-7v zMNZEbXY6eI?%VLalWCGa`a%{owK$iuY7|QSPxv@8TD<=-;PYmu+(h~o!WL5}ZgaMv zJq)nm)YZoUX8!)e2}O36wY0hSJ-%mg2<)B~!N<*)@96J*Nl26;Agp><@3i->{yaXF zlT+pun8?etWYcc!q|1zu^PdPN)TT}dxNBZ=@G=T{^2EOIV-~Oj)?coXb_}Om(nrb@ zELg<_9!<)6J|-94J09VIT%3#zn&HyZz_^irVrHtz2mj3X=N>C)e_ra_+dA4 zhoy+z1O6uwGuCDAI8hV^UNt1*Tw>K(@HI(o)79Wser>OQ zBbupJzBf}%s9t5bP{^r!(28o@fsF!kyYu(4`5vp|mbJhe87aDG%U0hU&K+m@r23cI zwh@r%ie_~({3B$O5|E3%NDZ+O0)83By3DRMT;DoQ-_#K&Z1cFu@7AXQ!f<`B4<8fy z1~nch0m?U>XHs|A{D|AfCMkh(ey|N{E6nR01mTsT?;n6YnsHehiz zP(?uJIty&5Xu5W>kCFiK16o23*K6z%DZwV zlO%p6Ee&qZG=zO#&t+8l>pZmZ9>}9VO2`V)@=YC74BCNd4T<>Lk~npg<*iRFh6|t! zuJk9d5@*_ZLjMUf+ZN+uXrFl6&XUIP?#Vphq6ApvYV5#kn|xiiW>KXoGwW@&bmka{P*ZsjwFB5>W>?)ddN87*Ah;~vT@{2_^fAMzDC0H zeUPT&B?^Z)DGz>^9g-{|hkSDAne}o4c{~=2)uDl2(u#OPnv~U|EBl+B<-oT^+`gB5 zUh*l&PLvHOy@au#{@A$;F8bdFWB(@r?)aWMu8kv-LcMygxdf>n;JuL2eRYL`yQZ)H E2i|iE9RL6T literal 0 HcmV?d00001 diff --git a/img/python_exectime.png b/img/python_exectime.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3c8050870e1b9f3851594f322738f59f18ecbf GIT binary patch literal 21170 zcmb?@2UJt-*5&~O6a*|NO7~MiK#E95iXtE)y?2yeLhld~K}A#qr72yI-n-O*s7SA& zg{Jh5Kqx6NZ}j`_f9L+QW@gPA*K#SEoO5!{`|ka;op4QcWjY#W8VG{uRPNo?h9Ghz z1d(MOrvm@7+AA6h{vh+zR=xujb+aykACB4GR=W*BrIECRhm_#w6K?m6JR#_e7wI?I zq%DUZ1ZgX)+`X;qXTCOZ!ZHS%eDuq8Hp(sM#J6itZ=A^n;c_fBaEFdQBbwr>4u z6MAoP$Ck_Ac2Y1XX(6Gl(>2Aqaa+0(719uU5?qu2408HB>CX`86a;bhoPx+9X!atx zJOm+cDL}^|D9Y|QLMWe)hP zOP$Z!GWm-ynTVsqbw5^~Pug8=1xDo|GO13Os=`V~bo+}JFG6G@GSm{qidHjTro>-a zXGnE&cQ37jtuCx*Y)#dAJ2ix`t>zaLbiS7Oc|33?Li~}|3a!YwL5Q5^iKr&cZbAS| z8~znr`BYRf!szCEdY!BXrB_wsMn0-Uo1Ti^*sZ40+_`GIK3*f{JR-y*b@;r0(kpntyMXXHji#QEc9@ z`k7X+;1~O%OyJ?cLVk}scZh!yU(BDvfmbupQPe!dsJbF*?|GH}BiUuM(tjBfp4 zMJ$M&*SCSg@h#e^w^2t!2JN#x?oe*mJP>70y(3~IBs*PrG>bOS@JI-}b%yx(66r4UA6W!X&5^y#UWT!Tj6_UFC4 zs^P5E;;mlqB0;i;qf7o*%u{i2&4c^`UE6@51~Hi`^0vE`UD`$Q%ZF^b0d@w4TrB6Wk+h+^No)nVGx&s)D0cFwAPjfV$_xGR5|fFb*HG zkHLBxl5>o{jgImO;;!qC)*_mBQUaEFm_&jOIxKuJA2vnrMlRiuCGO}{TX2l!O$^GS zi=ModnbbhwbOMivduA5-t_VB^-D6g)R&4gTCBAVdb9sUBaFs!h&^xiP)gkD+*JpM3 zg8|{jF>6-qmHW#Rez@N%S1Z2|LMw25cktt$QjbD0-*wNv6)j|1>d_3x(Wh_Qy@4MW z&NK>4RKxMR>ou-ZjSWf{2N#I>5#*O+BSNm4aceQ$+C=g(Q0fJMrvg5I^*1LiWX{+v zG^bLJ&ZykpxM$U)uP>NIZKO0q$>`SB_si?vd{MN;lnr7H7Gr{a zdupOj1A=6Z7AuP}cLTZtPO`m>JBOSFYkFCpLlf5(;7e*S(pK536*o)jO4Gd871%L678k_KMM-j{lXE?BTrOtg?IhEk2_*@#s(I zTRa{VbeMRwMQ^r z{n59}{!hs6@?zmfyUKpVoNopef4!v)`QiO*Ilp*)oApe`&6CgHii#^28kK*W7}`C| zYcu>TK&e$pXB{rfgcizM)t!02`ck#b($MCT<6lEg16I&I26B1MuEzbZf>cg=#Fcao zpC90AE}V5@th7hGTPVs^IX|K(`jk_2pzPOSu7j?H#An&(;^S_iw880&_f*OjPEmzD zycuNnG}4I00$Pe52`d%QrC&}-Lz)z;ok&IR-OyXRhO7m>xc@=MMa9R+1d0r{A1w?v zl+VINU;H>Tto6#I%K5~Qhe6e(9HmSED^}%XXsZ3G3smphf`dO@5t|W

h&=f@4`{ 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 literal 0 HcmV?d00001 From 2ec1bc4c0b2483dca0c632eae8eb9430c9660810 Mon Sep 17 00:00:00 2001 From: The17thDoctor <40616434+The17thDoctor@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:36:34 +0100 Subject: [PATCH 5/5] Petit erreur pycodestyle >:( --- __main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__main__.py b/__main__.py index be849bb..5f0f56a 100644 --- a/__main__.py +++ b/__main__.py @@ -38,7 +38,7 @@ def main(): fusion.sort(array) end: float = time.time() print(str(end - start).replace(".", ","))""" - + # Python Sort for i in range(100000, 3100000, 100000): array: list[int] = srange.generate_array_of_number(i)