Des algorithmes de tris
Trier des éléments est une opération courante.
Elle est utilisée dans de nombreux algorithmes (recherche d'un plus court chemin...)
Nous allons présenter quelques algoithmes de tris et s'interesser à leur complexité.
Tri par sélection
A chaque étape de la boucle principale, la partie gauche de la liste est déjà triée.
Nous cherchons le minimum dans la partie droite pour l'insérer juste après la partie déja triée.
| Python |
|---|
| def tri_selection(l:list):
'''
Trie la liste l en ajoutant
successivement les minimum de la fin de liste l[i:]
au début déjà triée
'''
n = len(l) # taille de la liste
# Boucle principale :
for i in range(n - 1): # n - 1 car la recherche du minimum se fait sur 2 éléments au moins
imin = i # variable pour mémoriser l'indice
mi = l[i] # variable pour la valeur du minimum
# Boucle de recherche du minimum
for j in range(i, n): # la recherche du min se fait à partir de l'indice i
if l[j] < mi:
imin = j # mémorisation indice min
mi = l[j] # memorisation valeur min
# Placer le minimum en début de liste non encore triée par permuation
l[i], l[imin] = l[imin], l[i] # échange du minimum et premier élt de la partie droite
|
Une implémentation du tri par sélection avec deux fonctions
La seconde implémentation du tri par sélection utilise deux fonctions:
- une pour trouver le minimum dans la fin de la liste
- une principale qui utilise la précédente
.128013it3a;dv,n2S5éwbcy+14: f-up08)_9eklohrP=[sà6(]/mg7050g0G0c0e0b0I0P0w0q0I0e0P0P0N010c0b0A010406050P0z0V0V0e0L0r040l0J0I0z0=0J0j050U0|0~10120`0A04051i1b1l0U1i0`0g0b0h0*0,0.0:0,0j0W0z0e0W0G0y0A0r0c0K190w0K0b0W0K0I1N0K0c0^050#0p0I0G1u0-0/011M1O1Q1O0c1W1Y1U0c0L1j1I0*150P0A0e0j0:0k011!1w010x0%0G0j0e0V0G1U1_1{201$231Y26280^0a0w0M0L0J0A0J0P0b180j0w0Z1@0L0L0G0q2t1b2b0j1j0U1I2G1:1=1;1V0g2d1x0b0j252q1U1r1t0+1#2Q2S0j0J2W1U0A2z1j2E2G2-0{1`2u2Y212$0L0 0I1U0e1L2z0x0:030E0E0q2%0G1Q2#0J0y0t3b0^0w0t1b0e2.2;0_2:2c2?1$2^2`2|2~0G3001323436382T3b0y1~040w0k3h3j1{3l2E2P013q0e2{1j2}0K2 3133350Z3A2$3C0d3e0d3I2D3k0`3M3o0:3P3R053T3V3w3X3z2R3B3c0u3e0u3*1c3,3m2=1v3p0J2_3Q3s3U3u3W3y3Z3|3#3c0m3e0m422-3-2;3N3;4c3^3x3Y374i3a3c0R3e0R4o443.473:493r3S3t3v4w3{393C0X3e0X4F3K4q3n4I3O4K4b4M4d4O3`4h4R3c0C3e0C4W2F4Y462Z4#4a3=3@4e3_4g4y4-0y0F3e0F4=3L4r3/4`4L3?4N4f4x3!4A3b0B0^0t0B571m2+1b2W2J0g1=2O5a4x2V1s1j2*0G2,3k3+3K054x5E2c0b0g0:332E3C0t3s5M5O505h5R1 2h0G5V5g4z5Y2G3i453N0H0^0Z0x5G2F5,5a0o3e5=5K4^2@0x0^2R1r0q0G0E0V2R5{5@4!0@040S684H4_0j0^0I6e596a0^0v5{0w696g0p6i0b0P0c6k4Z4_6b0i6p6r2@606y5}1$6b6o435H6f2@6t042R6x6M5?6O6J0^0D6L4p6H0w5U015P2;3C3E5d6(4+513}3D5Z275#6)5W5(3c6-0U5+6W0:5_3F0w756$5a0P0g0^02030d0F0f7c7e7g7d7f5{0`6U5|6%5N6`5Q3c3%4M6/6{523%0w5!5$4Q6=7v3*7101793e750w2z0c0z0L2S0w0I7h7f610b630i0w0|0A0n0L0b0G7Q0w0J0z0w0n0W3Q0w0Q6%7!0g7V0f0z2u0n0I0n280j0c2v1Z0h3Q7+0L0w660j0b1e1Y2v1{0)6j7o7n2/3M7x7t0y3 7w7r6:5X3~6@287D4,6=8t7H6l4_7K74757|8L7k0f7m6$8q6+4k5T8v7y6=4l7B6^8B6;4j0y4l5*8J6q7I6h041a7o8,8G210J0^0N6D8-6Q2g776m6c8 6g6i92216b0D8P7o5,8R1{3C4C8u8#8x0y4C8Z8A6`5%529f3I7M8=6z6F6R0j0g65678;6E1$8^048`9B8-6G8m8Q8V8r4T9g9n7E8%4T9l6_8w6|0y9O9r7M9C0:5.040x498{8?3p609x9,9u9D739A2-9t6I3:6Q0L1{1D956X919a9I6R9;9{019E0sa73N665la10:6Bag3O0^8:8o9-ah6Y6!44a44r9c0j3C4/9P9W524/9U9h9Xay9!9s767I9(0b5;9Haoak048lan9=ap040Oaj8.61aj6b0Tac5a9E020I0c8OaOaUaQaS5F7I6baXata:aZ9x9zama?aPa$ar4X9L5V8r54az8W8%54aD9Q8Cbb1U6 8+aI9#a561a~a(4!9E9G9_9$aQa!9Ka`2uav5R5kb99o6=5m8z9Vba5ibG8*9sbu9(7O7Qa 3K9`4s9/9y8d992/0U5J5p5D5r5A1b0c5ub+2M2H0e1Xb(0U5s7n0Z0#0%0P04.
.128013it3a;dv,nT2S5éwbcy14q: f-up08)_B9eklohrP=[sà6(]/mg7050g0I0c0e0b0K0R0x0r0K0e0R0R0P010c0b0B010406050R0A0X0X0e0N0s040m0L0K0A0@0L0j050W0~1012140|0B04051k1d1n0W1k0|0g0b0h0,0.0:0=0.0j0Y0A0e0Y0I0z0B0s0c0M1b0x0M0b0Y0M0K1P0M0c0`050%0q0K0I1w0/0;011O1Q1S1Q0c1Y1!1W0c0N1l1K0,170R0B0e0j0=0l011$1y010y0)0I0j0e0X0I1W1{1}221(251!282a0`0a0x0O0N0L0B0L0R0b1a0j0x0#1_0N0N0I0r2v1d2d0j1l0W1K2I1=1@1?1X0g2f1z0b0j272s1W1t1v0-1%2S2U0j0L2Y1W0B2B1l2G2I2/0}1|2w2!232(0N110K1W0e1N2B0y0=030F0F0r2)0I1S2%0L0z0l0z0t0`0x0t1d0e2:2?0{2=2e2^1(2`2|2~300I32013436383a2V3d3d3h0l3k3m1}3o2G2R013t0e2}1l2 0M313335370#3D2(3F0d3h0d3J2F3n0|3N3r0=3Q3S053U3W3z3Y3C2T3E3e0u3h0u3+1e3-3p2@1x3s0L2{3R3v3V3x3X3B3!3}3$3e0n3h0n432/3.2?3O3=4d3_3A3Z394j3c3e0T3h0T4p453/483;4a3u3T3w3y4x3|3b3F0Z3h0Z4G3L4r3q4J3P4L4c4N4e4P3{4i4S3e0D3h0D4X2H4Z472#4$4b3?3^4f3`4h4z4.0z0H3h0H4?3M4s3:4{4M3@4O4g4y3#4B3f0C0`0t0C584^4t4%4}5f505h4A3F0t3g045z5p465r4|4v4 4Q4-3~3f205B3I0W3l3,3L1o2-1d2Y2L0g1@2Q5b4y2X1u1l2,0I2.3n5S2H054y5-2e0b0g0=352G5y3v5^5`515i5}0x2j0I605w535A3+4I4`0J0`0#0y5/5?4_230p3h6i5E5b0j0y0`1=0b0F0R396o6c230_040U6z5a4#0j0`0K6F4!4`6C0w6L6k3s0q6J0b0R0c6Q3O6C0E6P444Y6Y5 015{2?3F5N5e6*4,525L206429666+615x3e6/5Q6j3O6m040x760x6Y5b0R0g0`02030d0H0f7e7g7i7f7h6i0|6%5:3N6;6w6-3e3(4N7t685L3(6_2a674R7B1W716p4#7b3h770k0N0b1#0.0x1S6W7S0x0e0h2C640x0z3i0x2u0o0N0e2v0+0v0A0b0x2r0A0N0,0M0e0r0A2U7*7Y0K1A0c2x1#0C0x0S7$7(0l6$4q6)5_6|5|3 5~8h6=628k7D6{8n6~0z402I5R6A1(7M75778C7(2B0r0M0I0N8G1#2y0K7j7h2T1t0r8L0A0x0X2T0b0X0 0i7*0j0g0F8W0j8#0~7`0K0Q0b0w0V7o8g608j0z4m7y8m6}534m8q7F5K4k8{7I8x6G4`8A8C8D7@8I8Z0%2v867U8:0V0x0$9k8Q8)2T8?7q3o9u5E7t8`4D8}936?954D926|7A9E97727a7c8B768O7l7k9Q8@9w7s8~8`4U9B9H7G954U9G8s539Z3J7p2;9W8_7v0z4:9!9*5L4:9)8 9`9K8C7K4`0r5A030x0G0L0A0-1#2,2T0r0^3R1#8e459V4s9y9=559^9}95559|9I5jao3Ja08y3;0`1c9u78az010L0`0P6iaE992_6T042i794#6C6Eak6M2_6JaR6N0`0E9U9/al9X9=5n8l9C8o5k2165a.8ta,8w9OaLaW1(6e040y4aaKa1aX040bb2aF0L742Tb7aM6S0`7-1B0IaZ6B0`aUa(a|aA04aC2/a{6R0=aH040zbcbo018W5mbj1(6!ai3Lbt3Oa30`a52w7(0t0,127U2 8F8H8J8H2x8U8*8Y0 0x6x0x0y0(858-0x0l0x0o0K0o2a0j0c0+0eb!0L2T0Ra%5.9:8ia+6a2 7z9$5j5za;6`a?696a719c77b33s0`9q8*bzbuaGaIcp4tcm8%0b8S9rbrc2bd0=aTbEbp6KaVcq6C0ict6qcmcF016!c15Tc36,1}5y6/c78~aucXcc7E9#94ca703lci76ckcGcP6C0QcP6Ib5c=0`0VcLaDc:3PaYcI6Z0`c@d3cNb58%czc{049tbsd0bwaJc aFc_cHbncJd5c^cv8(cod7aSc|c~dfdkd2dnd404d6dBd8b6dua!ddcS5:0W5=5U5,5W5)1d0c5ZdT2O2J0e1ZdQ0W5X7p0#0%0)0R04.
Tri par insertion
La méthode du tri par insertion repose sur un double parcours de la liste à trier :
- un parcours de gauche à droite commençant au deuxième élément avec un indice \(i\). On a la garantie que la liste jusqu'à l'indice \(i\) exclu est triée ;
- un parcours de droite à gauche du début de la liste jusqu'à l'indice \(i\) pour y insérer à la bonne place l'élément d'indice \(i\). Ce parcours utilise un indice \(j\).

La fonction tri_insertion suivante prend en paramètre un tableau de nombres tableau et le trie dans l'ordre croissant en utilisant cette méthode.
Il s'agit d'un tri en place ce qui signifie que le tableau passé en paramètre sera directement modifié. Il est inutile de le renvoyer.
Compléter la fonction pour qu'elle réponde à la spécification demandée.
Exemples
| Python |
|---|
| >>> tableau_0 = [9, 5, 8, 7, 6]
>>> tri_insertion(tableau_0)
>>> tableau_0
[5, 6, 7, 8, 9]
>>> tableau_1 = [2, 5, -1, 7, 0, 28]
>>> tri_insertion(tableau_1)
>>> tableau_1
[-1, 0, 2, 5, 7, 28]
>>> un_seul = [9]
>>> tri_insertion(un_seul)
>>> un_seul
[9]
|
Code à compléter
.128013it3a;dv,nî2.SR5éwbcy14qL: f-upj8)_09eklohrP=[sà6(]/mg7050g0L0c0e0b0N0U0A0t0N0e0U0U0S010c0b0E010406050U0D0!0!0e0Q0u040n0O0N0D0`0O0j0A020e0!0E0f0A0o0L140Q0x0D0L0U050Z111315170 0E04051C1v1F0Z1C0 0g0b0h0/0;0?0^0;0j0#0D0e0#0L0C0E0u0c0P1e0A0P0b0#0P0N1+0P0c0}050*0s0N0L1O0=0@011*1,1.1,0c1@1_1=0c0Q1D1$0/1a0U0E0e0j0^0l011{1Q010B0,0L0j1i0L1=2d2f2k1}2n1_2q0!2s040a0A0R0Q0O0E0O0U0b1d1f0(2b0Q0Q0L0t2N1v2u0j1D0Z1$2Z2729281?0g2w1R0b0j2p2K1=1L1N0:1|2-2/0j0O2?1=0E2S1D2X2Z33102e1f2^2l2|0Q140N1=0e1)2S0B0^030I0I0t2}0L1.2{0O0C0w0C0v0}0v1v0e34370~362v391}3b3d3f3h0L3j013l3n3p3r2:3u0C2i040l3A3C2f3E2X2,013J0e3e1D3g0P3i3k3m3o0(3T2|3V0d0}0d3!2W3D0 3(3H0^3+3-053/3;3P3?3S2.3U3v0w0}0w3 1w413F381P3I0O3c3,3L3:3N3=3R3^4e3`3v0p0}0p4k3342373)464u4a3Q3@3q4A3t3v0W0}0W4G4m434p454r3K3.3M3O4O4d3s3V0$0}0$4X3$4I3G4!3*4$4t4(4v4*4c4z4-3v0G0}0G4=2Y4@4o2_4`4s47494w4b4y4Q520C0K0}0K572Z300L2Z2?2$0g292+44014P2=1M1D5r323D403$054P5G2v0b0g0^3m2X3V3x4(5O5Q5i3_4S3w2j2A0L5X4P5Z5T1=0Z3B4n3)0M0}0(0B5I2Y5:5z0r0}0A5_5M5a3a0B0}270b0I2.0U0L0Q2V4l5J4Z5b0|040X605{4_0j650e1^0L0e0D6l6g2l6i0H0z600 6e5`3(5W015R373V3X480A6G505j4f3W5$2r5)4,6R6L5.040A6#5 6w3I0}0j606%4J5z0O0}0S6,6m5b0j0s0}2z6v6.4_6i6k6D614K6p6r6t6}4^6h0}0H6B781f6O0I5S3v3|5V5P6H5Y4R3{6T2B6V516R7k3!6$6-792l5=040B4r6?6(450}0b7G6~5b0O5}042.7L7A3I6`040Q2f1X7e3)707!5z0!0b3y7%6 0}0i7S626)046+726@6x7b6A726C356F7m6I2f3V4h7l7t6Q4B3u7r5(7n5*7p4g5-3B7y7y7_7=0F7:3)6:046=727z7;7I7Q7d7^805X7i0C4D868d6W894D0A5%875+4C8h6!8j6#8l8w0h3,0L0D0Q0I0e680j6a2S0Q8o6/6;8+6n751_778z7M7`040T7,6^7J8{8^0Y8y7 4J7g8C4U8F6P8N0C4U8K6U8G7u89967x8R8u5;0}0r1*1_8.8|048n8t8T018q020#0c0f9q2l7)0}0J9C1}7O0}2f0g9H8U8W8Y8!8$8(6b9N9w0}020N9A9V6o04246s6u8?7T0^6i8`9+8v3*0}9t339k8,040C9V9E043z9:7#0}0Y7|4H7!946J3v4/977o5k4/9c7s9e885!ab9i9j6$9v9$9(8=929,019.8~8max9-a39V8q8s9^ap8:9)azav0}9/at9;9$9@3D9_4_8q9|9u7H019~a0aNa204907}a7817ha90C54ac8e5k54ag8c988fa.8Pan8kaXaPaC8-aW8@ayb3auaU9}7*9 915H8A7n8C5ma:8H5!5ma@8Ma`bham8jaG9%6q8;9*a#5zawa15zb0bA7-a%b18r9#0}8V1_9Q8#696b9Ua)7^0Z5L1G311v5u1v0c5wbZ2)2!bu5sbX5D1B735z2S0!0I0B0e0M0L0I0P7k1n1p1r1t0Aa55H1I3E1C0y003,0#4r2M0P2B0A0g0D0A660A2e0Q6N8%6b2N0A1t0c0A0D1fc9cb1$ce3H0bb 0A0V2b0j2q0k270L0m5 c4b-0y3g8V0Q0bb)6N0t0b8K0O130q1`5K3p04bK8X8ZbNco8)1v5Lcr0Uct0U0O0D0h2pct2|c#c%5L0:0Lc;c)0m1G3E0Z0(0*0,0U04.
Tri à bulles
Contrairement aux deux précdédents tris, le tri à bulles utilise une boucle while.
La liste est parcourue par cette boucle tant que tous les éléments ne sont pas triés.
Pour le tri en ordre croissant:
Chaque élément est comparé avec son succerreur, si il lui est supérieur, les deux éléments sont échangés.
Le parcours va jusqu'à la fin de la liste. Si un échange a été opéré, la liste n'est pas encore considérée comme triée et un nouveau tour de la boucle while est effectué.
Code à compléter
.128013it3a;dv,FnT2S5éwbcy+14q: f-up08)_j9eklohrP=[sà6(]/mg7050g0K0c0e0b0M0T0z0s0M0e0T0T0R010c0b0D010406050T0C0Z0Z0e0P0t040n0N0M0C0_0N0k050Y101214160~0D04051m1f1p0Y1m0~0g0b0h0.0:0=0@0:0k0!0C0e0!0K0B0D0t0c0O1d0z0O0b0!0O0M1R0O0c0|050)0r0M0K1y0;0?011Q1S1U1S0c1!1$1Y0c0P1n1M0.190T0D0e0k0@0m011(1A010A0+0K0k0e0Z0K1Y1}1 241*271$2a2c0|0a0z0Q0P0N0D0N0T0b1c0k0z0%1{0P0P0K0s2x1f2f0k1n0Y1M2K1@1_1^1Z0g2h1B0b0k292u1Y1v1x0/1)2U2W0k0N2!1Y0D2D1n2I2K2;0 1~2y2$252*0P130M1Y0e1P2D0A0@030H0H0s2+0K1U2)0N0B0o0B0v0|0z0v1f0e2=2^0}2@2g2`1*2|2~30320K340136383a3c2X3f0B22040z0m3m3o1 3q2I2T013v0e2 1n310O333537390%3F2*3H0d3j0d3N2H3p0~3R3t0@3U3W053Y3!3B3$3E2V3G3g0w3j0w3/1g3;3r2_1z3u0N2}3V3x3Z3z3#3D3(413*3g0o3j0o472;3=2^3S3_4h3}3C3%3b4n3e3g0V3j0V4t493?4c3^4e3w3X3y3A4B403d3H0#3j0#4K3P4v3s4N3T4P4g4R4i4T3 4m4W3g0F3j0F4#2J4%4b2%4*4f3`3|4j3~4l4D4=0B0J3j0J4`3Q4w3@4 4Q3{4S4k4C3)4F3h0E0|0v0E5c4|4x4+515j545l4E3H0v3i045D5t4a5v504z534U4;423h3J0v3M0Y3n3:3P1q2/1f2!2N0g1_2S5f4C2Z1w1n2.0K2:3p5W2J054C5;2g0b0g0@372I5C3x5|5~555m610z2l0K645A575E3/4M4~0L0|0%0A5?5`4}250q3j6m5I5f0k0A0|1@0b0H0e0H0r0C0M1$0T6s6g250{040W6I5e4)0k0|1U0T0c0K6O4(4~6L0y6m0z6t6Q0r6S0b6U6X6o1*6L0G6#484$6.0z63015 2^3H3J5i6{4:565P22682b6a6|655B3g705U3K0z7h6(4~6R046y0K6W6@2J6%6J1*0N0|0R6$7j250L0s0|0j3V0T7p4u6_720H603g3,4R7K6c5P3,772c6b4V7S1Y7f7h7i7t3^0|1e7q3K7z7u7w7y7%3T6*042k6_5f6L6N7+7-7(7@6,6V7_4)6;6m0~7}3R7K7M0B447P5}7a7R4o8c23697W5O8i8d3N7#7s6P6h0|0q1Q1$7:8t250N6q042*0c8z6Y2{6x0P0b7o836Z0|6?7I884w8a6~4p628f73668X7U798!7c3f7Z3n8r8r7~3T8K8M7H3p8s8I7.047x7+8_6/0@7B0|0l0P0C8@3P8 3S0s5E030z2v0z0e0C0s0C2y0p0s0O1 1H6802030d0J0f0K6U0z3z2E0c0C0p867J8Z7L8W0B4H8e8m748i4H8%9N8#9K8,3q8T5{9H8b4Y9M8g7X8i4Y9R9%8n5n9#8q8.7$8A1*9b0|9d0Q14390C0P0-2A0:0z6T6V0z0I0C0T0x0C9s9u0f0Ua3ac9v0e0h1 0c2z0K0P0k8M0P0z0p0M0p2c0k8G7+872?899Z9J4@9$8)574@9+aI5PaG9:9;8:6i040A4e8H908;040baW3S8C0|2Va#6u7?0P9p975@7;7{8O8J8Ea*4)7v040Ba_4~0Z0b5qa?6:0|6=6$aB5=aD648b59aH7b5759aLbf5PbdaP9;7#aRa(6l8~8:7la4a/6n3S6L0Sb37 a!bs7;a{0ua~25b0b29XaX6L0XbI8{020M0c0fbQ7 bvbB01bzbZ7lbDaC9?0@bO8R49bM6`aE1 5C5pbe8h5n5r8k789S8*b{2K8-bnc38:9^049d9m9o1Dbwb85Xba7a8b5D8Yb~6d3ibib_5C6e7!c3bnbt6+6Ubw8:b#b/6ua(bZbO0ib$cv82cA840|bAcJ7kcCbEb*01bGbW01bK5FcD0|bPcQ8`0@a{8}2;99cB80cwcY04cMb)c$aYb(8^8:cTc#aXcW3lcN6KcZcFd03ucHcxa;cLcGaZc/c!8Sc=2y8Vb=3g5Scj9,9Ob`768ldm9Tdkc17gcs8.cu7m8L8Nc|a$7/dC5f92047E0,bwc+4)c6c89na.0i2z1d0sa3811%2*2y6y0pcc6s0Y5_5Y5:5!5-1f0c5%d/2Q2L0e1#d,0Y5#870%0)0+0T04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)