#### 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 ?
+
+
+Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ?
+
-É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 ?
+
+
+Quelle semble être la complexité de notre fonction de tri ? Cela est-il logique par rapport au code que vous avez implémenté ?
+RL;O)oJ(L89^rR-B-D2qP$)AM`$JvH=ZDC0 z>e|8t15d51C>%AuVF6-1ep|*DOn2Z_e;e6L@`T*7;cg0-p~OAxPCVzWnjcx=)SF2q z8Z_;#h(uGu32tFJx|aOVe1)V7JqBf52KrW~xhsrP-= z6QlQ &cWMkAmI>h zu#L0zA$80~s|eOOS~#CcUCSZVmc}gp$mq?wM 6uA3+RF*l> H d(`|M;v)g%k4k>^J?-O}&l#o4k}R=J-)e}1YP2#g@YVP@b( z;^wF`>a11u#oW-x31x}^k#AkBf_6{ei+B`XrxN|O^!3i+;bBZv)b!3X; zjw#&XJ~!BC~A-C)Z>C~ z*_pzJN!~y3X}xjS!iwPOkf8RwhDBycQ~1`jKxU}8_IV4AZe>2E%6J#k&8ZESHa4`9 z 7%%twLhR<=>|1N0&AayOq;=J3r8hvd`>}*0}z0%p`_jKxlBwC zHfNB!Ty<+pdYz$n*qxDsk!Rk{E-t z8=& _`fT?Ka63$jmR(P=2wgtvPqHx7vj={UB;#7) z0y)c#{cHbEcF5fT`XR7b8+sjcSVURs?NCF%dp&`IQ@j)8Qlpo86W=PL@>z97Pj^tV zb`J|a>JF<6MXeHgVLvlBpN}Rpor{d>A#&V%Zbjw&r_6dfQJp_tEKB8Om3Vt&l#?{= zr%{`sf33?Ef|tW#5aCx?VE<8I$x6+4IXByMXYt2;Kjpy*Nfg3DgNUGwO1LZ~E)Kl| zgB4GGQT8?+XGLJa`^hewHsgS2OGwZ?`CLo;^ClC)6nU7Kz`7OLRmEm3*sIpjPuyht z80V2nm!^|yV{fu_DM=jLX^@?gO#2w`rIq3ml+CtB?ym@Uk~cRvjBhU}@xfsBdQF-4 zXqrluDp!9oE$l|b1q%>GVd+;B#kgrV3=F7~@ma?$`JZgH4^%lA6TdjEQ30ss>x+%E zmeTVNsNCY``eu@o<-SEb5@PBD4okBJSkJJvr7&q?-YHshfz*l#90=CJ>Tf#`rB&qy zl3sD@dXmR~lY_?+# #%Vlp{vc#Onu$Q@;JI_u6wlC8@-xl$8Z`yIgrnMi>x@@ zhOg6O!Yv_@Z+*BZeH^}!I-i1MS;5#s@p1_pcC!l Wo2X$DMAu8{pi~~CZ{JM)TX)}u ze7N4M;)mBMEDg+M5$9gT$2^0@LO8&@jC$@LdF8N+W2ekx_% ltItg>6QrP_|d zUg1M@fyChoV0(HAn|Rio1a@Mu8t9ZMBsZPJ=vN4QDhwq+)_KMQW#Uu7?i@Eh*>avq zq*S7ibaZB?UznRqtcYrlq~=tWI4u{-eyKbBgpn5;Ce 87@SQC}87Uk233y7lIg&VJ2gTSa}qSM?%94#-96yqXoFri9xcw z{m(B5l&~JiC8$d<8c%jTqkBt5MGw|&IM(kC8+q+~z8NqLz}foGyad}{#a{;*yit1S zkunQKTibjW99Y2gw%g1;_gTeUmhaCGD$d&^*-88X{Q$2-L`1{`Cbx4oQi6lWyywA7 zI8 ;fDEY9!cA1FificH+|bf1)?Nn dNpqY(V(@W*q0`j>9Wv8 z&fXBbQPNJuLrV^}xy;-pSIN_^W|c+kJ}JXv#nB=!VQoN>4@;Gj^IArYJGE0@Kr2wD zgWL&wn49C7j@L2fzMims{J3+YNZGLvhARW*DTy?GyChRHGfJ196d@EGuy1=~CC33_ zeR>=em1_tWqS4Mb6o9pc;c6DXMaxqAJ~i)6Vwm#T4!?cp4wakjc=ZqHBzM*^4>`vA zy@K2Jzvz7H(%FdBRT3DVKSyf9K6U{xy+ZFWTHZNGFL8*DmF;2|4T^sTfN)*Q+#EOU zioR~`ym#=*_-GG}Y`N{S!Ihg`Abl0+SMf*I-o6Whoq|PFQ^yo-s>qw}?{Sj@g~~3_ z9xW)ysVFJ&>Z> ky~oY0(#=D(;k2UP)!HP_G=g8r=4i;mVm zRwyd8OJUt@ss05zNf2HJBtjZ|o(zwWu*lha`Q1C*>?^PU!wXMyF3Wn(4P0&N5_iD# z?=Gd%$?Al}MCScT?;_>~$5;n=YezI)?_)-{R;AL^1A?iG5;>t3K4)z6$Jv4$mgum( zWRohJ9&kXFFDQ?l80blF-|jfrnw`tdPP6Xsm3BRyOG!!bLKs`h4LRQgl__SDG!ujT zEtcim9Tm&4#cLgfMe*jToE8Xk5Lm66^s;%4GY4S6(o|CufKh@L) C_fE%Dgm(uFqNUKe4Sn>BYF8?HpAMdZ4s2-gI&a4q8A0r z#4WO=DTzodnA9+EZfd*^6WQ-IccQQ^lWI#jC-d8ZOf4OFJr}bGvcY!G(bmLoy<>9Z zibm{pn5F1s-^4vo!11n)1-e6+sI?rcxxzU#a5~p_FFrMOt$aDq8DC_};=!LpZ@t$! zJVt-IOOoZ=GB<%9Rjf;@O#X`$I(Q9TU0r$EK>A%|q`=2t#{gC`0%GwlUdOP(c;>^4 zXE7X=U(x1esa)znS-L;tt_%`u`~Tw2Fwbopx%D3zK| HDB~h`(}!gKq+c%0+?iO zTALb(Ad(Q{dpv&glSlyX!S42f|Kdzgs5w z2j nq1Eqk->Up{K#d<#^~j3-A)($p7l7 z&0DuXlBdnHouUPBxJteHdF0NTU#XIukYUoBw?f)j(+6OIqW)(-ojpCSUO!Rcj{yyp znr4_IUrAi?;t#d*?r!11*4}hzH#+o$l4!W5Le$H~*lIYd#)a>}zuS8tMh}4AsE~^f z@YQ(0yJcID{#QbhK}QyGB)nA&&2$NJgs)cm5fT3!s38*kx1oDtWY1;U|ACxPADbIS z!+UaAbjV2KVL2wnIR0x4v^8j|)qqXlGLtzJ#6@B%yW|U!5(CCh y+e{*c)mqoeE)+YX|J~?d|P~fL26d!#+H3z!X(r_D+bI1K*!3tk;N#e zdK2*bR-cW+)SzatWWSfij5!?g5Gs*-Djdqomf(nSVW6p@h!895%6pUfoUIBh{~%24*2qlGD~>y=cdMQ Ky{}^3VK}pLG8nDr@9Y@ hwHthgqPA^avsAnlB zLk0Ep_c_40CNs@-_FpAUk{&xhag9~#(BrsDi0D@B3ymI}5lgYa4mbylN|pVD^()Nr zMiXbB*gha4)~yVI6KVbk@R{0HG@GsDX7&*0e_Eb?*v@k3*N0VepG$AR? >C`f+5!UerHgLeQ=WKkt00!g{dj^>5hX0iCadWE_h*Upi`7bt@<< z+&cCAQ<9QcIy*a^QOW{|6|wl&ScWSu! `ifk zTF96XmwQ31DiJkFB i}H`PG>46bb$oGz|O9$uCCt0_59oA;CJt$2*nSY;aTTs zH2S^d4H&M<2FEyC22W#5MY3Y1i7EclUnKU+F}oQqu5Xn7X*CnT*1=;ZB_T;{hdRiz zk&BC#P;iHmw9qWIuy=mh&su&S0H9XK{B@}O%On|9IpbR95H>VTXU}3z)(GXfSE9Fj zx0X*AZbo78-Usn|WvHOnMAMAK%*;%sTcW&2s$0-CiyQzKS7r1VPh*@=Xq8-9mU7Qg zyVoL-qrysL?n9iLxP|rG^o)#2x)UJHQjx^*^>YALb?q;XM%c%o`&L^kSCaYlm)3yfj~-dc^Pwf$}} zCKn}R^Hhijbxg{kw`u37Z H% ze&pHkccN$b>^{Cdti(+_B3=)NWF)cSvoVKz)`?t2n6@>1q^-jxXQ&z7R5HE$0xAZe zzDl6!gy !&phgSSGPjk>Xgqb)6*I0{00QO zNB_NLYmvY@2`Oo^$^Lqmz_;10{cEID Lji?croq<3>Iyd=4~X(PASL&K?8-Z98%Gq!(#j#UM4 zef;n`D7O05@@Eb}TU%M;FouI0R7(R4N&DWguboA-x(>fk>LGxxF7qp?Y#=1)s4Z eV57>sZ7<>niF56SEVV5U&A_ck(`}|BUITzX6nRaa;@6lje z4uTRhQv4`~4OrunrZp-nydFI4%Vx0R?-3JM(f-EgT1E#8)+lPfhxwu+du;NH18qB4 zA4))cT?yL)&VjC7DRe ~K#rJ~|+ zsNV|ARo(-8F%h4{Fb$)5FmwmeIgzMHzaT-OBr%7v2X^nR*zV2_^bKmA6-j8D!kWkN zY`XVM+9MEXw5iLYx?^;7G#l1c7{_ScdGV^mqHBHqzHT&g(Lt?awrg-ilzi1b;zBcV z4YoPIOynpWda{(APBrqJlb>HJ@H*Lx(aINif+8ink-&Sr7u%=-wavZ~!jj;)atEd0 zCvw6olp(8MR-PPa%J {`5#Ri2d9GVgxO`DsWJO6|P)Ia4` zC=l(ZC4^t+W9dpez2E)_frU>Y0pt7Su?#$GY?ruUDKx`U7?i36I|aY(1A!%Y7rQH7 zHDCogfuIrEGk?9;puv$whR%3nWpD=yq4XS;ZgWB~$#7ubwJOd|P9>t7&Dh*flgl;} zpQE~Yy#Ff9(HPzuG(bZDkSN4wGYPS<0Fpi y zy!6-4fu6sPt;z2&8j3uAzW{@&q_A!z0Sucp_{}>Uv|H>{6JBm#CHSt_6`h)D7xDQs zy>%KEFN@d8uHr_1^rto9!w+1#3lXdmNl#q~wGF6U+z7V~V9mjxsp4Ikp7!ARE6AMV zj6gZx38E4^ME!+w)ONtlPZzTomX?-ORF$lPvd_q1QWLKnLgupC8>1ir$n)pV0ade> zsi?&2f=csqbsv&a33FHg0e1RP&E9^M$a;0lWwX>LL({?*$h#V^xV&~OAyzqU&KSg3 z{<2O$;kmLdwU=(2Newwef|VVyHTuJDhrTE$ffSCS36F>#FSO5Lckd6(A87F*;!>$f zDaV!Uvfi@~JcH!Th{De^Vr2%TwJN3dUYB6}N2XSZJtwx2t72-pDo#HmM>|?A9t&z? z(d=A?GP_ji(6zqzT+)Gr)b dO@3ANPyrxwb_3P4nSaB1yH5r2Yi}lNBh(2}gZ`bZwY%88c9$7aMLgnr zdX(VnH493DLln#FP3L|iAam>DAPImDf=A$r{Z!+G5H{@V257j+FQbc;B-j5MQKvd_ zdlgpKIP3&!nh$4?1?}jA7H{H@pM25n5tOWD=Djiaob~ `70j}4Fh*kGZe2Yithvdc&Z&=1wB9*O+QPG9 zsOn2a> uAR2rUHetKu}O^|~~(M!Fm}p$c<5_Dr3#9y_r=w0EQ8 z*^`9(F2Slh5lN=(MV_ I%Nnhuxi1x7oC&Cm@kow*oHm0IK7= z^EL_*hGtil&*wqo36NtiMk~HnLp0?-jKD?N`oQcCooocJz@in+knYq)Yfn+pY 7OK%xz2v Qu*1jC9F6&574G+R%`R>Wcyv*aPDkL_jPd^iDhDD z&Z*@4O^xMw+t* 7TY#o-Ydmaqd5O>TC%a~dG+!>5Mi zL4&xQQFr*^-hB>^_|j7DGMS2?G$1MAR%{u0=N7Z}{Rjcd_lS+{6G}{1olWL+-9*-T z87MbbsL}_&Brer~r}ZC0Z|bFQ|Ni~`S{5I@cLYdc$ptySeGCi?Lg`mvAF}~mgwLOA zbpjy|AC?eDWrgTTvbgi`yJ{S~4$xk7F>7yl*7gr!)%yeDZ8)3iv_hJu9FB$wmRN?3 zhkDB?i2hq-JxGroK%GCO&PZ&e&k>tN@;+evd`Av0zP1_w@RZ~!;4MC+O`dFu)GU>7 zntqLWA;kPCF^uvSlmD4AHN+3XA;<@`jvpc#4Qe!iim3u}=q!KT^9al`_Cf~&WQ-%g z$bz~(KyS3_Jj%4OL1Eq3J{XdmrjVl)1{~Jep>FirD6a=7wsFlt8K3j^+^0m-J}Hg~ z=)$;9(TcTQ-TMq(kw=db#Q`e;Za00|cDzx0AiFS1_AH(gq^M3IyfxD U?Jq}1TFhwO;7pl zS!10Sq{qBCPIn#VJo^0T6ty>EIDXuMD8}*h6dF*u%=qxbXyU+j^6EjUx;H7X6LbfO z=6x*nS-xS~0W|4@bf$AZkNcuuS~!{jvu6Z9Av|V?x(KLjv4g&RkshjM!|bG5bU75R zay%c!g7LC|Z)|=vBV8_6S$%&M7EVG-CYf=2@>6iR!`Qd~nb^pg{4T*PT>(BrYyk?$ zPGnDWhnLaYevCDNkz}G}?nOKt8^&t{-LmZrJ7_M`W2nPU72TN)xFY38E{BKB8lP>H zST)|}Q>SLonGUS^GH^AfZtKDV+V1Dqze3$mfO<8_$tydLAbIK5)|N`q9;6ljSM%LS z4`i8Qzvy+^=BGkKOqW-8OMmuIg D2n68| z*0g+frM}1R!C_&pUNG`JvTc5aE;{3md{u$uMtj_t-DV-@!+^g~R{?uTOA_Pa>}=W* zMXN$6X;OADM#(*&Tg0%v_OsMt m< zEA#PmoZ)uBUbQnB+r `NzpKPwFfaXBc$$~is z5D-7MmFXKD4U&`=<~&u|aF01T6!4vUiN3rvC_WDL8g_}f`8v;}YTl+E@Vsvzx3+by z5@pZxT*)BFni8&09Cw6kllfuo-+cNObjkiDD;?_uU@J@ZaOOxqP*tti!*vPMq`@+( z1Ea1t>oL{p14i}iu^i4bO80J1HjvYj1!(?aCxktN6rild;BYhJ2^#CBT5{zE0+KoH zbFw2GhSy?%w$v0-<@{D|$dt|2LY4sus}3-2tc<$3iOr4$%*=v*FSu`lN38a`VjO {7-uM!1%0Psi0)b;rN0TCN?B@+gX%4{{Ss)y7kePLo6 zN9mKuixv&^HIlkH&~v^8&Q1Mi7(^Ue@Xa0&Ev%J2zM?2LKzvd2+wams4Y`C&U_j3_ zAnN)DE#8CW>sx=fZ1wvf1r)RlTs*Mo3e0NQPl!eRBYF&~%)H0eXHc97olN^O-3X@g zeu!pe!0ze|N_V6us+#TJGyOnlu$J7ozl{q70(A7)g3qbv>=5(4E%f=^gw&Z_tXbvl7wFpR*qI@AvUHh#f{tf_X}tsVRg!1=kvXrKu5XI*1$-T+CuUb-t$w8 zMFI~NKm!!IYMHMHywRNg#>`Dg#d3gW;B1}RNSMq{qu*y>dOtT_`~A^-7Sq$kyOht7 zOL{=~`Q{a*nx!E5Um`>GQd4(GFOfay2nd3KD8aG@gTq-BXB8j)1to@tXotBj#6S_D zi3!DjTlP04ZrBfF#FTEeuDv%#5#)3rI!_j`x!1zENMAJWA91o3h>FDP04$h3uZu8P zz)dOc{&!36KXlKHn40dMCyMelfU0$zE_F1hn_b&IVTt%^$6}tBTvfy^WEmD{f8cgX z((SC(8e$$H735X=5Rk{YuM6F`*b&sFI&gcXbb4CDjroKeV5!gDwgqxHFu~COuIJpm zPIU9PI@$K%Ft_)UXd#a$FRsF0xJq=&iAi&aGmU~m_(KVJD6}e7VSe6cjEB9maBi*@ z{X?K#3AP-0`uO@f8}J9Zrl!h-6cP{H1}+#ZTvzT5IzOKc2>$saVJsvh8?gyfhICDL zo8&-Sivct-6cQF4YkYrMVfOK`(SX^`bh)}5js?q6=nn!yVipb#r0Avai2=Sk^p91a zn!Oo=&ci;O5kq%1 $m;`9h6smqt-; $A7EW6n*X*-y|MKPe{)scM)`f(3^?H)P0-+j1Vx_ Wwfj+MpYn%==i3XI#VO2OvgVZH*ibKe7%1*no#dVS zI?|lI1fZ>Ulm=UEcu6G^D7HZ;y|Kd30u8h9%eoEOF~{~)X?MQc3PsO>^qRHiohfT; zLk1cZXX0C;@-_9zkE(2zL@8jfYFbn4nA5jOrXp9o3v`UW-hjKeS?g*)wLY47q1WjU zl+Fkgy-LQuPl`1r4_#w>j=kz!9-B&T$dMh*YM^C(Kc(>OeT?XX)KvfeST%dBY9(xp zZyzTje5~v9IM8*Zp=?~7t2$Cu{n_^=n$U8RjlX5NViMgeMST>h^FXx(`xp{+y;{j4 zDw&TU_H|GfL(gH3ZK&wxfI8eq? m` z1lOt&;?mIAj};KNi2%4K!Fpg{W$M3~da^#^fF6~YOS*qot97m9?*;!`E)ma~j)3 zk>zBcUM1{)#n6fw+>s& zph3qoW*{vDc `Ka@FPb|;QT~*nMC+QcPjqJ_+t+}c6*7*J{DZUBTw|C?Hbux(0P(u z_|%c*YrGD-dr4i>Wg;EE8ARv}5U`B>yaVZt2Qo(k@_FxSyapA_>46o2=T_s=dcrJe z=Vz-!ZlDk>ty_&s8OlYREPp~~DZOY*_oF8?99HB|4vBZS( `}|^ zy1YpRVI9nGv0x0CkkXI^q%fT%IIfYLyzZ*Mm M9J!3fjrS0YDool8h6;p1bF`vB;0uBiYy9bMI;Dq^o(Jn33>FxJH|TAuYQ zdD1mov7BMoT2{Fvy~H*KntI^+rz1~Ge@sI^_7J-idB$%;&Up2PW+D4{y%n*LXU<6n z<6SRQYT)nj5VicTIyNC pEi3EcLT#HHj9F*WBqg^%yBp)Ls-YYZb6)J%6K_=4e^- zc8Ije>s$y)cA4D&Q~CceED$T-ppQm0z0?|AzB$ZoN#7Tr6wn*v@6FV2$6Zpt<>z)K zl;g)tY2EMi?O)}Wh(id4ramdNUMh>%_p~2>O?mJY8q)oH2KZJCI}r=5?uwVDC%y-Z zwJQVO2F;0~%*`R;-)mDF9%)Ybzi!M7RNTY$D8T(@$ok50ID#aSWTx6sMy@cV&~d9L zOp^qwu4iYr#-wolp=9Ot|8v`4iO~ F?pBR% bj+(9>!czmd1g#WRYi?jsdrVb=>f|$& zA#P;+0-JxDKK~snZ^rmuc9AQzx0^wdVC|_2>_)p8W!};gsV}^DcOxISQ}c)ZypJN? zPXFjktR7#Uk2?0uze6|wnjapR&ikjOe-FqjqT}LjXKQ ^@7*i5K_s0bu~to$O#H z5YS8X92_cv1Qg~+plXYWi=zhbdn>I0&savuAz}+~Ol!4sl$( z7AP478x-`cKe}~=rv{n;;u$76aoH_od88~GNTrg@rsE3TKMJf7{Pmz2a8S@x{SgpW z;|MV^wJ!zh-awX(UQD2qu2w?>{s$i{Nx;YdyAkwa_6j;yRz)B~nB92 yi1^?LoSiqEX2zDslXk+aN=1V|Lujo1i*SibCyusEME>N;=`yVCYOSt8F0X3 zT4{SI|8%ANxqW(c*l6DtPQe7)-YTllTL-K({h>qc3&(yufZCLomv{2I2L=b?Qc~__ zGeM)3Wc;@8|Gq%G0t72HeF^J!$!B&o%D^+~?CmYUcvsgJ8T%U1`FWpO%Gs|@`W>%f zfQk*Vu&|_Dd_H)=D#nS)z0rz(C3p1&WPHF ;^6Y`=1}9bH?B~e#6>X2TM@NE5jR~HO z;zx^lwHw=`jf~dYHQ}iXd>@NQPHPu41lCrDds>bcRFsQeE+73g%wz9jXIXR*6vn@WG!}>)WYZ~b-kFgQ?*1)?8ffxArz`9FQd^Q^mGW2n5h{@@_2E!U@|jklvEoJv zs%ZCjYiM3WmUV5!a&Hn}w@*XFKIyH~#-anP>77S`Hz=)*G>%ALE*It|6=rxH`L4~t zr?zy;Eu#-ZgDu8)o)~L;HP+gE$yx!+u6io)dS%Gw&9Lh34&TRF=Xx>&v5iwwnbR~* z4i5gcqx#3zN8_V3^xFLoxBSX9o;-OXi-W(ubvmjIJ#!7^;U{9gCc_ex+L|~Y9Zrra zcCw6Z#Ed8SG*NC(RnKqdHmNP9$A|@;{r*^fUAh(Ug|c&aHb6x`U-HFftjeKi&t+Hm z%fjK;B7Y7oy~p#XuWM>Ij+2at`3&2GT~_$iQ462;>YFxJw#jpsTx?!P`P@Ca^0rR2 zDR{+U>SwM!cz#T6Ti=y|zJAayHD_;aOr*d>^TNhtQBBp0VPRClkM(R84zY|#jCcrI zG)UKT-xlN|C-<*bRsGo@_i?ZA&7)ijUkQ|aQa49kkC00~_}R-xN3`_RvW9-Ml52~- z&yTRDw#W9j{ DCh3MHyb8*CM_gRNI(fRr5A`J$g8d z68!MNof<(Wy)U1q#wPa*1{e5#_YD)$*1YnYsZZGY;U#hUYRFuRfa&qnBVNy?>!thn z-!lF-%34(Bq^Lh~zb9mASYzzywbazkuFX>JTTQSaHMKv_zi Obm_b_ gjZkiP)Axr}mN@+;C02chpX~Xi z|5=>h^l=4d(=W9e3N9`_ 9{Zd5x<2(zB9ptL^^Z?>fpGx54->y%1^)m4!8< ~{^YEbl6HmcQT;%NS3*F9pVf||F<#Ax7>^jAg;4K?U z-XLzz|G-HL5Cx%=_|5Kppki4N`!gfYD-IxgK&ZNgh8f@k&9$_ovn{gt`=JR|peF0N zjos|@0BGkpe(34~(IhH6lG&{P!>Y0(S4?bd@Al3Q)ZR`*---(&{-Gxlo|fSnKY9$O zA|C*I1vd{COW#nGF83?MoOpOqr`b^bG{g>g_6TU<67mgd2IBO-x3?#M$p6Ap(_b1C zOw0siK47F($bz-cTY+{b{o`{17MA4>q12CigSQDO_x&NWp7T5;lPm^IMS$WRP9vYsRJyOTDt#?t5kps2 z+>A41Bi;27 ZRn%1G`KC2)$}a>`yqYU;tUz;yaj$Drsc6wKi7ep(h&}9PFeg z@t1)8cyuXF9~*d$%wOK;+kBtB`wp~ZURQbO4Bhk*J?i@@Y@W)u*YBTxcD{2Wur#CF ziw%242D&{4#g;$rZRfoFK}^N>jAbL{-DrP+fq{X~=X{`_(6tD2)6zaaOjF0-h%%xi z=q8Wj)1mGg%+*lt-;cBQTomf_kKK2wC$j~D4#37azC?C;4KI1!=(BY;TwH+n{nnB> zKO}b*%e z+Y>b=RP7%obKW@TVCRC+1$dp%*O1;vFq-d+Y$XFU*I_vn<}p|_Zx&Yzk)}4ffZ1LL zgyl^sQM0?62xY)q-<<;_FL+TB_!jv5fArd&fQ)x1631r}k7LFJpF;jEFQf9PQ0m#M 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 zcmbTe1z40@+cta?f{KJ2g-xRfNK1DpAR?uNNUL;9cNw6fA`L?;ozf0%&L ze7T8p;Egb_fd;&thJpma8wG@K3Er3?Lh$^M9Q5xe{?xwb)XCBo$8Xv(^ `J}8y@>;&nQ94aFJHc7iyM&dDklfOTjjnW zNz^USX9fQ`kGTzsOB**fHf9Dae=k-Ki}NYdC<1MT)XqBvxfmNKzh;ykw)XpwpWh*s znU$5G6rGr8$2evSH_lX1dm^8MmVlTnDos8_Li%Wzs0aRDOQB;@POYbV$ijpFfuDT_ z2Q4~FBetWXBk-xciK3!nZq=TGn-l&hw6{5iB!O>YG8KKjgam-KGFetnLTduiL{)TvXMCOife z9qI0%;gH(J@R6Q=MVy^+wR^$P)X> Njw0#YCS>#t^ z#Jrc&4`!naoCl|#Z@Bj`E>K|f>tv_77h*;`^=RkA`_et*1=EVK8f(i^zuVBTK3r`s zu-b#0!5x2pILuNgrb4C8z)Y!>+4_W-=+@`__8Hx&NVCsTc!Vha7x2RRMria+cko8t z`vQ{$zxX-cp(`^!VR5NDFJDr(^997QB}taKuWrmrRa(#d?pZnQ&4RtG5Xb)d+WoLr ztpLt&pIJY%y$FfQ=++P32%*KFQMI)`Wmfeqb&OT=VMv0Qs>ZKb%aSV;#7jo~sjp&MhKZooWb zPZuqwIPhiBb*Rye7+8$Dr(wmalPc+cK0SF5dbOcDPx(}Z!sM9Y2_UE4%WzG?!;Xj1 z@wM;S+@myp&vN)8n*$-$GlfW|TaCI(in&kBW_Zcc7nx{7;cF vNN(Zcn9Ss^O;@lM+waUL |w%Ey`Q4)dvDH0pfb)*N)3J8wo? zCRC_w# 761l)rXzt|g;3jQHI=h7qd`Tm$=IkGWqR?gO^dI$#jMB^xTm8(>p&J?+QrGyJf4}&Krlw{h73k3CADR_c{pv>3E$3BB z`6}1IoK9Ec%A&jrTewcWotN1S$jm+bspllrZ3tmo)mKWURufWo->(6)I`qlO^nN|Z zWg1gk@{^ZRdf1Z2@xJu#BizHREm9ui_xsnDVw_RW2lJ(W$W)xKWpDra 0RaB1zythNhXBJH^NRtW_Wb;Oj(Vqh#vK6&f3)kbpFardu#%Y zHCP5mGGp82s+~scU9}}TQjB5e>QYP7HP^`>UU{!6?3!X>bTF42pP3fqqOAN9{RfS( zjdo LWd4ojzgh|YRZ4%8=fIEK0Nssr;P9Axv1xuwcFpn4*d+T8&6;Pwo0~Lc zM;BDe;5+gCmyrkmp68g_J8G)kNYJfl%VZ!{^_kY;aBfzci!Ye}a Ma<=yu~;2MwKlzuirP zj7-0!@-Z|2?F@lbYGnIq$CG2S!7={xqKX?oNm8`S$=e&HC0c8gsoT2>*H)z{|2k-q zJJv{#<9M%6a>;jJZLW1R-{1Kw&_o9;`CQz=uIv@NURgQsS>7C<@Sa=;V>>Jcruy<{5< %YFjI2g{Nx&UtY+%>HwKjT8qY6`3mZpNe-l?B;D~)Qe`3H9)0-Re0yFWKwL}aK zcNVq1{M#U}-LxRhYfH{9+}SpiLM*-KLA(-pbAL&;{+%S#vD`S{xGmKoiXPJ()!}X} zBPfn~K~)n0mhDppF<(OqKHeCU!!(7r46+=9=axCU#yxU;t2Lgu5L5V_w5PyT!$R6- zZ*K1_a%r7>`c1jX?WKD>)8kATtx-J-y)uQ-;Ls%a&<2h&v+W)6=K_xwC1<-`RNbq zvvny(7$Xafd9JxDjR_(YBqt3i&x&;jzsDo(e4t>yb +r-dwX zYuKSvF!1|zxZ}^EEPs1M=^{NT+8d#;2}E8gh^!=k!4J=bRAWR*+FM4P41V#6!}+rc z<2?7apixW3ZnSqQ+`(vSD3XT%jjk*Ny{nWN%or%5m07*z^iSRf~O8)Y&xCxhCyo zMvf-`#tF}fN8g(h>LYUMjrjyk_OwM}8Q+!lky-pOshr+fYz)d#UKg;uVRGAoWfmSB zil?_d7-E{Ks8!ron@il~pSv!0>k9;Qf8{ j4~hdYQ(k#Xac5?I(W`1XyQ}{xK|YL0xljK``Rby z?Zo0@Q6-MY{50PsuRE9UM(itPskFsAbz-1YnUh0Tg|U==AjT z`Ukh@p+KvRr6&a&(@ZKIyJ5i@ZC|H&uUXSV%c0o~Uh9*M0;Wyp^vbNl%`7b1hRbc$ zuB{+M>=9Sk*bqzJ^T=&Hh+=_^LHrUq-+}hg$44R78da=ntMpFE;=~lR=P!!Q&CcHT z_O23Vl5owwa^*_P>R7c}^`}qwZ{NOc2C{(6g2L)m33S#V@PLH+r|yuOBzQ0i?RMnJ zj`N&hFlhhau^pbkE8C7d%dCA_q*+{6)&%4rS6EoSmbJIFb$p<^pEqsh7<~mt3qe0} zKYA9uPSLu`l38a;COs%a8Y65qFo9h2Vo;OWG_R#hw8T5js*&Na_va P;w71|16@JY>mydXld1zDA)-; zhJCbI n|~H?|3Z)LE+gYi($FQ`xJ7Ur}ZZCb1u{=$$M0F zH;D1@6nKYONS75@)AEkF$ya8(6memez@6v{HU=}a=mbj*wSIX7Q5 YTED&`Lx)`b%!|V*9GvaSgN8*t0^>K zU-e$mh&>hLFW9_Hif~JsNIc`05#Vi^CHlC=V&$RT${AcSsrN)a-lhs)t=YDQ%>Hs| zhGkc>h2<+=qnfQvKkGZSrp;t7MOE9ww&vLRo>?h+3bB#T#Bcw)kywRNSW*;qtbHWr z_^Uxjx}PD}Ze@FC)EBjVGoPVL=qy1L$P%oyyYoF!f2D8O2IR+&cVrHJ%F_s#wQ%@w z4qEPR%xLQCbAqhS#T&u&uK@w2t?53<5;l5ERy6ByFRa5pO>&p+6uE>9WUkB#iV90V z1(5`JWDxsY*FY>{>g&(=)BPdDHFk+5@reZl(dJg<1{8vPp`D=XLhC4Nf@*iZV5@$| zbgZmu9vLE Puy9xW%%gPBe(MrmE+#+>E<1Y z;#wf+H5;pP%VdHAZ()C>dCl5~XlK^FW&^yBn*SyDASHOAJ%FiQ8L5nw_SwGW<%K-+ z-py9RNG#hm>&@2?@&te=Tz-Se4Pbjl6)#dz+3{)R#)6Z(q@!ry3v=nm1C384rlhQU zue7$eM{*U_lz9J`NN}v<@Y}=k&jBw$>7g|HnVJou1cmcmspso0J2%EJA6C6qH-cSw z^0}{18##-xRiy(>{!ndlg|$pruwD4>7WoUAOFp8u#-)tBNp1sj5~I1N@F9v9e#CEE zDFeP=F6L6BoS*yB*(v?%bnO1Ryp9hk)?#smxSOz_I__G958FV?J-*O0VX~ zaLT)P6IkH<#$|SwZIQ?EZeUPF5>j_J>RxUn?C-Zn@z @< zKE3za#hy(gnHzLxey8I-eG2pO8ZYM&`$`>09cqU-r;4X3eegm8ub0n?rM(Z*Ykm%P zO@}$gAlwI^RXC5}I->)sxqZ>3UVqJhTj^#!0<*Cvt1$)+PTn=Hm2a*;C5lfH1^|Tm z(QWf%jL*!*rV^%z4B@z|{;KBZMBqm<1m5?D(vRJ_h*rmzc%&DXy3^#Br_MoEBH#qa z!^zZx!6zEiJ&JTQ?XOszt-aa37GtT~jWDt%!)1@M&M{Nz1 ocM #)f`Vs%v%4@B2)~E=F&wxy81yW%zYIfVs<@ E<7+S(|nJD5Yxei)57G z^)>Eg-2hX5sK~1;S-Ri6(vKYF0-So34EGSbQdly!lSj7-gv`;T4YEr?o57@X9WgHC zvIieI3XC?pCupF+J6^k6E6yh45*&GAm&dA`RGeeQBKz|LG$SX?JD=5Q9}?W*S_*P; zb}sSCw`T%@#f_QYQMcE6xqas0RG!w%E(gK%ObC%CC!L%eSlSB<3v3Ki8L`F!)^xze z51SnCJ|ErPA>Qy`H}+;u37eg#+NA3%Q8$V#}hD^UDvoJ^!Vlw^x&cgCkryk}au1 z>}R+VqthxO#QcejUWT`nn!3H{=+5Qlw<%G!MDEd+Yt`CyW9*-i1ORN5e!SY9_B1^s zBdOwQxAflD(%k47Nbc)Ga));xwrlGm0B4w5=xpnw1`70BYGrRna(qB%0GmBW23h^7 zVSaIrUKq|?LEp@lQE=0VIz$=QdILO;@+9}vFm1l4Vqv=_%VYMwioG(@WYo8=_3jah z%isjS*(262XFvKFk{Efxak%)&-*)+u%DjHLP4x8ibevy;ur!OTECz`WT4mLJ&>*O& zS+#WMBy9JavaB~@5ISDoTNUuRfr%pllO9-DuODBYN5sZjZX`xKXjFo^7cb={KthBE zk!A{_3iQ3FcV4!gqzO2)qvdva=W)H2>GckOXOQJ3T0(MYJ#yecjq7}oLwYQtqPiBH ziPmrT*XrRQXZnrk_+!wqss3P!F3>cqCngVaGm@q$CMWsk7)A`Vju1oF9|60Fe{~To zR{pTUqr?67)ay^p4)?ay0s5-;frD;w-YI4cI$if}Mr@ExCOJ_MJlVW|yOBgWKQMpg zSkH8WLC HIbxO5An^7FY%^MV;+FjhW zaBB1vB)9UGQPR31u6k+xhF7&!nClBi9t@LnjH`-+B^A+P$}bd-kF^x YxDA7I$0FGj} zuT{XWKGBMzS_3vdo)O*|ix@q#Zx=0Fzb{p(%#jtSjqv#2@NUZa$MN4ib;q@7FWF}` z9E-&+GD`>wqSK#VB~8?EcdziW1NoBVPDAlY&{i)0bX+Y#M7drjE6l!UplGIXup(YM zA-eO*QeB5%*OJxn-^y*Y3JuXp&VArAd`yQl_1d8I$E$r}|TijL*&hNM9bW1%?O; zmw) Q@ws*sl8$+8EI>7RPwVBV;2H}$whvjL%Gi%ie+Y6bEA;^aOVZcn z-&;NEHW{*-RnXjhc|~ `) zsQ=&s;a?TvfxNYTunY#b)_>uRVkngk)1F850`QwZ?^yQN=Ry(zThz`IKb?^89p6j& zm;@lFGB?xJY@K8Ao)IsJcUG+=uBQG-2wm=_c{rB4nij(7?2Z2+he;x|;B&F8{-Qx; z4f;Y@Q#ZY3MLR*@gt)h%s!edGfNg_e!bp*{{2tC~sSNstc--kk);cMNavT^kDY!6C zCEZiOSbnPS=+pJh*EE8;n@LOWgG!Gi%f5M-eiZ8_qtf{W(GZ3367|*04&z%^76D(m z{O&yAKe1#hJ37f@oI}^hEjr(zvXlF4-_*qCrxskuU_un_>1sig@KcMVp>34)K*f;{ z5gGkFnD>YTqHjr(6;v8LS|Y&2QmkIKk(4m{sT;YP|0DB})kMBvM`7mjkNkgiwh5~R z qNAbepPn9hpBi!4ufel2NO7fSXmS{ws*p=S)Zy_xxun zM_@uwDY6*CPD%IWcUwz?lC_t+q;ZKHX86zx835I{n}&w6O5#i@g*<-c@ba)t;V>(i z2*P7a+5H>VhQ1_kHR!p#akC74Ny*-Z62&ZIUvZQd_=wxmI6!h{J&OJgIZFsKCh1FE z^?UILb^|^ozALerYwQ?lC1d}20pxC5soF>eoS=%6LZ@8@2x?>bD;ziN5pX mFJTm`bi^2M zFAq(Xsh3-$*-FC%A?AbKU(o9`j6{!{h_u%oHk& 5?@)GZSB9iE D? _Q+u}lBrcG0T<6R!+5m&e4~ZI&-_PJyK1AXboLH0a}4Nn z;VeCmzBnnb5~=lXlo2s8_l(Xd;+)i#l|j%R`12>gQk^|Ii8lZes|I7K8wUggX1D4U z(Dx8ss_KG)_bDSZYJFCb%^keBrNJ&cwJg_dWO}+nA##=$O$0r=X*5&frZKy_Yhcz^ zs#s#(jJFU!Y;1w)*In%t!z^RYLB*X~dX3^rr2mb-qa-!Wi#{%U@p82}|F5_~x%_^u zL)bypgV3l|3A@5EZ+lUgia;UlYaCV{82*)!7JrHlK`kW@biR = ! z#?0J2o@ep?)zgrBpB`^@iRRJPg0V~2if9tMOX*(gsWC}}2sEKRpeZbLZJ=OQC~U|? z&Ubsrvb`aQ02Q8`yowDb))Zcz&^3gepTfp>8=1`)Icsrx7Nl{uo1+8-)1%X#Sr_&H z?HQEcmUfE7Mn|{8$P7gR$*E`q#cPJ=|IVYsr7DhqHPxt$u`M(b@EjZdhv|&aP)<@F zU>0X#kq6G$vh%C76;Ys78lDqic(iD%+1ktr %XSL`1qtXS zVb7lr^y>X<(fE*1|JqTV{Kip9V`5nSx)hDlf*o`k@vcLx(sr;@T(bZ3Q{p5LkZJJ% z>{9A@@t#Za?$gZ~c8r=ZXwbw*Mlsy#n1TE9_lFyae%20~0KB=v%G$Vq2MG-b9#< @}sR0)vWoQ|z2-!VTN&1!hg3 zNM?Gm>a+UkKiq7Ir)+==)c6!;f6F3KI0XhIOCJCDf_@8D+8i$=XP<0b)d;-z)#{m& ztr||7n3w`7f&Id|^K?Q4a#zlPF`fSqcKiDEAm4-aW 2y(gPo&eg7LbgC2xz zH6Z==w`cEGW)MI^9k0mSGTfG^CUeY%Z~p?wVn2yo+MT%seUn;BsQ^x0bfzL;e*_~T z{U)n)(6s4wj*O5}Rc3yE{^F8185C}T2{N_NnB^B7Yy&vZ^n4E`8_!oQH#N)nEr2~V zwdOwX266T{J06rz(kj&063zk>kpf;DW~CveYy1I6zH^0p3;17Y1T9)X7OT40yfM=b z(AwU5KH&2V2Tv3k2m||lzQHoDIXtgL4c3hh3%05k8#Zc{RF5|NWR+vZDfimMTi5$T z3A7?7)l81Dot>q4P{s2rkCR0mlfN}K_Un5~%E*k1=b1P-6s7}>#wMII{1wNBhK8aZ zeJwU^MpRU-RxPQf7!w4}-Wfb FLFLxf0k$CoUHx&wzW~amJYd)G}M5@kUp tA8!xkt#4b_pd|z}C5|+1&uWjE`&)RJlHBPqE z$NTq} x872(uD7s+iFpt;0c15il~0uCt7yuQT91`#_c^F;w-qO2Vr=X0Y~Qv` zAAXT(*;zje{Xk#Z-J?E^9D&Ci0sOY4>->X?4|FoVo&`$v{)dT@OIagbNI_H`vg7th z)%`nM7ph`-4A=m==&BD L5MyZYgazQf3_< w_7qSNH92fhJB4*uPT4~7mz %A};Rp5y(xKZg3bI8#^#6g)!PwtyqUgR=ow9A{RdBS?E(G z^;?fZ1|In{=q?!jnH?actG5{`+z$XupM1hjIuScDa}N^e#RWKh@L&HHvhlE0_m9D0 z79)vD;T)Phc43ZWML&q*>rU+@NbIO2SG&YTHfF_yF(MQ#(JC0Z-@bNa`|d(Vm7%|| zj53ufjU1Rf{I45m 9-DcPo11v;8ceUlF#7=@@>Eu(WBX`?2%yv!CnAdIvPUT~sDT@7 zFs-$6RrX5c=0Iz2UGmc(%0DQ0VYf3YX z7Fg~ToLTVU m}Y00EI+ELmf$s@w#;frjM9=4O&4l)7-V zT_iA6yY|Av0oiLrd!K_RcXB>bC+S2lg$H%txpXEGpops1qk!Zh#U0L+kt7gpk?-31 z_}yM2ty4c+if@
1Md61qnFu;+{`!D4m4RtSf$ z&-TCTr#Q(xo(S}MU6x8Cx3igKK9IVbtI`=Yx4H(PI4;t-R%;@N@afhXoBln?OP8)w z@fj~;0jRdXy}1IwVgsgCfzl5BL&xFo;}HNraUq7F&wxna<>M3myt!0V&$~I-C2Q}L zIx9{fr-pcRccj88s6&7Ndhm3s!3)GLns@Fn!|5Ktl9MaM?(9Pi88ao#zhrRyA<4EW zk78(`?! !f|eL@)5vAi~l8zQIfa16bl-Z4-(Gfy}^2s-41JOYXRS#$H>LpymXK>S)dS# zKhLEa>+fo~*$oZ@wP80s$na?Yq`r8uHT&*|E0U51a3udWgvtN@ L@)@R(l1 $lqTc)kxlNAqYS zVd=e(q%AYU+p9=>;*8rX)}6&$y1WL|2etb-qJePki8TF&JW&EMaDepfUniceeG|+^ z%zm#As7Gs62e0O*k(?7&($Aw9Nbf&AMsI`bR(t_1Z|d^yo2YmHr7Aj44V%n-l-NjW zQ1LzbK6>i{g}8)-CByaJrQ0M0gam>Bx{9olMhRB{ 6=E)=;U+lkNUNGR{j6g4JfQ4g{;w@aLd7tF zMd@uzTQpbFy~ltds*q4K1$?MFAC%xa@+m#H;Zp_D0%U;D`{(7_q)FC*A1H5i8EDXJ zw;jX|7&yi^29Zl+-=Qi0L>UzF=zL%!O$PAB_xV0jwf 7}R5YWs-x2(zzq`{q9J9z8{!LK^f# zES#LjAW{JE@;?r2Z?Zur?_MiN`&5e~A6Va-$S)mxbLc_&D>YA}9RZBEKGngB;BKmC zinYnO=v{~EABM29D078M_GRY(-<}>94pe(M(ug~!qf3;u r!3LAry6R`UQxb^W+j*TEvbK40w7aHTK1 zqQC!FWN)U99bwCV%mh;9Tv&;LmWU>*1tdl!Ox`Y>;rj)J!u(F&ku_eVy*aU3wU4vp zZX;?gVRX8{gg)w2z@h3m$FOOk5n^1~VSgOy`~z96^X=InEI9ZlvH)hIYJT#w*XC?% zUyc^5wDi~l>EBmx8ZgPRGg`(q`OIV%!6f76np-T$7wm_Nga6|?sBOu6W6JWD2_$FF zCNe^(v`)<-O^zbT>zjaHjG< {PB^B<0l9RL1-FU##&?3j Eqw0B~k9UvI1zpn}7&%gFVqcW7SCG!S1G7zuZ_m@On<|aoCr|hCnN@2)Lf{ zj}M>f(a-zLAGOg6E!}ex9ryg;!X9{MxOnLux3_6^nN?0GL!vrUR2vZhicl3|*Z%m8 zj;C2uCy3Zb`1>7%t;i0pg%6G&YTgT|87bRhkyA0Z)o)U^j2YsImbScs$ QjclYO q=VRfl}AgXmk*aTslYoK$-cWk0iN2$bh_3`49dMoZ|2JZi8ZTZpIUCS7c)lm-F z!v&2bM!vCXFW{OsW)mDGq=D$7uwYtfWioAUuzk8FEbr;;C2F_u_$j`qQ$S077b87a zma2D`6EGfCddFm56AgHC`R*VNaPNeKp49`*-{7t0w>q~cY3$9g^+_xwS!C}*nvIw- ztC91ypqxP{4q)c!Ym<|c)0Opy1+8xG*8ZD7Is5%B*~f;l+pCQ^v90!^iCj6BO|bCS zs^;B+`Zl}l?n@A9sk5met^jO+Kg2;L_T9S%cUL(U>)VO|PqY5f^X;`(aWp-MVW=b4 za)DkVcBs^{9eC{yBqNZfL?T`0ZUctQg*q^pc9`#O$HsVWz^4Fx?Z%#}=uz13isC_m zsi%irqlj8)XlU3T49GvVgx=t?L{-e!k5{hkU-PiSRCzlw8?@p<50v1j!@je%H5`N; zo7t|CRgIz4K%qgpd61XV3gD;4#Nz{>xwhVTOaw^U+l!jmTc2 GK0a;l~{C{_9&dbf6UiP}R!UI!kH8`bpz4xMX zTm(Wb3*aOC5-BMuZH)-O7aB 8Z8#`l%(_dU9C1AmLHpq&{dWT_B zzGi>5n$6x6kiReh!@ K}84plT@XLPTQ_ zU^6SvB)iS(Q4{l;0Lir@5Y^p2J~~XQ4*Z_6+wQ%yw fMs)4!1x@jHvL!o*uDp}MPC3tS(oCAqlcA~vo$g& z`PRQ1#;l@y1^VW_0@$9|St;3#7M6`(6+UrkIlG?Jztyg}0p5jve8AthbUj;3VR{Ub zL1-CJGB8T1sinor$EPvdmEwqR!Q(4n-gbe5hez0;7q9r1CBmQ_+p -LG?u9qsGh z_B30p$3-ytvo|7v>_A8qfT#}gu}Mkx8}V*kvjDDC27sNRTfdIQXXcE`^Pxg1dT2pV zCn8)llzkQ