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
.128013oP;f 8lkg5:+,bry2a1éh3tvw=u6e[(Sàn9]_s-c)7im/4p0d050X0D0x0s0R0h0M0f0O0h0s0M0M0A010x0R0V010406050M0B0S0S0s0p0q040G0b0h0B0=0b0I050T0|0~10120`0V04051i1b1l0T1i0`0X0R0y0*0,0.0:0,0I0j0B0s0j0D0N0V0q0x0v190f0v0R0j0v0h1N0v0x0^050#0o0h0D1u0-0/011M1O1Q1O0x1W1Y1U0x0p1j1I0*150M0V0s0I0:0r011!1w010e0%0D0I0s0S0D1U1_1{201$231Y26280^0a0f0c0p0b0V0b0M0R180I0f0Z1@0p0p0D0O2t1b2b0I1j0T1I2G1:1=1;1V0X2d1x0R0I252q1U1r1t0+1#2Q2S0I0b2W1U0V2z1j2E2G2-0{1`2u2Y212$0p0 0h1U0s1L2z0e0:030L0L0O2%0D1Q2#0b0N0t3b0^0f0t1b0s2.2;0_2:2c2?1$2^2`2|2~0D3001323436382T3b0N1~040f0r3h3j1{3l2E2P013q0s2{1j2}0v2 3133350Z3A2$3C0w3e0w3I2D3k0`3M3o0:3P3R053T3V3w3X3z2R3B3c0U3e0U3*1c3,3m2=1v3p0b2_3Q3s3U3u3W3y3Z3|3#3c0k3e0k422-3-2;3N3;4c3^3x3Y374i3a3c0C3e0C4o443.473:493r3S3t3v4w3{393C0Q3e0Q4F3K4q3n4I3O4K4b4M4d4O3`4h4R3c0g3e0g4W2F4Y462Z4#4a3=3@4e3_4g4y4-0N0J3e0J4=3L4r3/4`4L3?4N4f4x3!4A3b0W0^0t0W571m2+1b2W2J0X1=2O5a4x2V1s1j2*0D2,3k3+3K054x5E2c0R0X0:332E3C0t3s5M5O505h5R1 2h0D5V5g4z5Y2G3i453N0i0^0Z0e5G2F5,5a0z3e5=5K4^2@0e0^2R1r0O0D0L0S2R5{5@4!0@040F684H4_0I0^0h6e596a0^0l5{0f696g0o6i0R0M0x6k4Z4_6b0n6p6r2@606y5}1$6b6o435H6f2@6t042R6x6M5?6O6J0^0P6L4p6H0f5U015P2;3C3E5d6(4+513}3D5Z275#6)5W5(3c6-0T5+6W0:5_3F0f756$5a0M0X0^007c5{0`6U5|6%5N6`5Q3c3%4M6/6{523%0f5!5$4Q6=7n3*7101793e750f2z0x0B0p2S0f0h00610R630n0f0|0V0u0p0R0D7I0f0b0B0f0u0j3Q0f0H6%7R0X000B2u0u0h0u280I0x2v1Z0y3Q7Y0p0f660I0R1e1Y2v1{0)6j7g7f2/3M7p7l0N3 7o7j6:5X3~6@287v4,6=8j7z6l4_7C74757c007e6$8g6+4k5T8l7q6=4l7t6^8r6;4j0N4l5*8z6q7A6h041a7g8W8w210b0^0A6D8X6Q2g776m6c8:6g6i8?216b0P8D7g5,8F1{3C4C8k8P8n0N4C8N8q6`5%52933I7E8$6z6F6R0I0X65678#6E1$8)048+9p8X6G8c8E8J8h4T949b7w8R4T996_8m6|0N9C9f7E9q0:5.040e498,8%3p609l9W9i9r739o2-9h6I3:6Q0p1{1D8_6X8=8~9w6R9#9,019s0m9{3N665l9=0:6Ba43O0^8!8e9Xa56Y6!449^4r900I3C4/9D9K524/9I959Lam9O9g767A9S0R5;9vaca8048bab9$ad040Ea78Y61a76b0Ka05a9s020h0x0daS4!8YaG5F7A6baLahaIaE619naaa%aDaQaf4X9z5V8h54an8K8R54ar9E8sa 1U6 8Vaw9P9_a.83aZ4_9s9u9*9Qa-9!9ya+2uaj5R5ka}9c6=5m8p9Ja~5ibu8U9gbi9S7G7Ia:3K9+4s9Z9mbcbl2/0T5J5p5D5r5A1b0x5ubV2M2H0s1XbS0T5s7f0Z0#0%0M04.
.128013oPf 8lkg5:,bry2a1éh3tvwT=Bu6e[(Sàn9]_s-c)7iqm/4p0d050Y0D0v0q0R0g0M0e0O0g0q0M0M0z010v0R0W010406050M0B0T0T0q0n0o040G0b0g0B0?0b0I050U0}0 11130{0W04051j1c1m0U1j0{0Y0R0w0+0-0/0;0-0I0i0B0q0i0D0N0W0o0v0t1a0e0t0R0i0t0g1O0t0v0_050$0m0g0D1v0.0:011N1P1R1P0v1X1Z1V0v0n1k1J0+160M0W0q0I0;0p011#1x010d0(0D0I0q0T0D1V1`1|211%241Z27290_0a0e0c0n0b0W0b0M0R190I0e0!1^0n0n0D0O2u1c2c0I1k0U1J2H1;1?1=1W0Y2e1y0R0I262r1V1s1u0,1$2R2T0I0b2X1V0W2A1k2F2H2.0|1{2v2Z222%0n100g1V0q1M2A0d0;030L0L0O2(0D1R2$0b0N0p0N0r0_0e0r1c0q2/2=0`2;2d2@1%2_2{2}2 0D3101333537392U3c3c3g0p3j3l1|3n2F2Q013s0q2|1k2~0t303234360!3C2%3E0u3g0u3I2E3m0{3M3q0;3P3R053T3V3y3X3B2S3D3d0V3g0V3*1d3,3o2?1w3r0b2`3Q3u3U3w3W3A3Z3|3#3d0j3g0j422.3-2=3N3;4c3^3z3Y384i3b3d0C3g0C4o443.473:493t3S3v3x4w3{3a3E0Q3g0Q4F3K4q3p4I3O4K4b4M4d4O3`4h4R3d0f3g0f4W2G4Y462!4#4a3=3@4e3_4g4y4-0N0J3g0J4=3L4r3/4`4L3?4N4f4x3!4A3e0X0_0r0X574@4s4$4|5e4 5g4z3E0r3f045y5o455q4{4u4~4P4,3}3e1 5A3H0U3k3+3K1n2,1c2X2K0Y1?2P5a4x2W1t1k2+0D2-3m5R2G054x5,2d0R0Y0;342F5x3u5@5_505h5|0e2i0D5 5v525z3*4H4_0h0_0!0d5.5=4^220x3g6h5D5a0I0d0_1;0R0L0M386n6b220^040F6y594!0I0_0g6E4Z4_6B0k6K6j3r0m6I0R0M0v6P3N6B0P6O434X6X5~015`2=3E5M5d6)4+515K1 6328656*605w3d6.5P6i3N6l040e750e6X5a0M0Y0_007d6h0{6$5/3M6:6v6,3d3%4M7k675K3%6^29664Q7s1V706o4!7a3g760y0n0R1!0-0e1R6V7J0e0q0w2B630e0N3h0e2t0s0n0q2u0*0S0B0R0e2q0B0n0+0t0q0O0B2T7X7P0g1z0v2w1!0X0e0H7T7V0p6#4p6(5^6{5{3~5}886;618b7u6`8e6}0N3 2H5Q6z1%7D74768t7V2A0O0t0D0n8x1!2x0g002S1s0O8C0B0e0T2S0R0T0~0l7X0I0Y0L8M0I8R0}7.0g0E0R0k0K7f875 8a0N4l7p8d6|524l8h7w5J4j8.7z8o6F4_8r8t8u7+8z8P0$2u7}7L8$0K0e0#9a8G8V2S8)7h3n9k5D7k8-4C8:8_6=8{4C8^6{7r9u8}71797b8s757d008*9m7j8;8-4T9r9x7x8{4T9w8j529N3I7g2:9K8,7m0N4/9O9U5K4/9T8=9+9A8t7B4_0O5z030e0A0b0B0,1!2+2S0O0@3Q1!85449J4r9o9$549)9.8{549-9y5iac3I9;8p3:0_1b9k77an010b0_0z6has8 2^6S042h784!6B6Da86L2^6IaF6M0_0P9I9Za99L9$5m8c9s8f5j2064aY8kaW8n9EazaK1%6d040d49ay9=aL040Ra?at0b732Sa{aA6R0_7!1A0DaN6A0_aIaSa-ao04aq2.a,6Q0;av040Nb0bc018M5lb71%6Za63Kbh3N9@0_9_2v7V0r0+117L2~8w8y8A8y2w8K8W8O0~0e6w0e0d0%7|8Z0e0p0e0s0g0s290I0v0*0qbO0b2S0MaR5-9!89aV692~7q9Q5i5ya#6_a%6869709276a@3r0_9g8Wbnbiauawcd4sca8T0R8I9hbfb?b10;aHbsbd6JaJce6B0lch6pcact016Zb=5Sb@6+1|5x6.b{8;aicLc07v9P8`b~6 3kc675c8cucD6B0EcD6Ha_c$0_0Kczarc!3OaMcw6Y0_c(c@cBa_8Tcnc,049jbgc;bkaxc:atc*cvbbcxc_c)cj8Uccc{aGc-c/d3d8c?dbc^04c`dpc|a`diaOd1cG5/0U5;5T5+5V5(1c0v5YdH2N2I0q1YdE0U5W7g0!0$0(0M04.
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
.128013o;Pf 8lkg5:jî,bry2a1éh3tvw=u6e[(Sàn9]_s-c)L7iqmR./4p0d050$0E0y0t0T0h0N0f0P0h0t0N0N0B010y0T0!010406050N0C0V0V0t0q0r040H0b0h0C0`0b0J0f020t0V0!0c0f0W0E140q0U0C0E0N050Y111315170 0!04051C1v1F0Y1C0 0$0T0z0/0;0?0^0;0J0j0C0t0j0E0O0!0r0y0w1e0f0w0T0j0w0h1+0w0y0}050*0p0h0E1O0=0@011*1,1.1,0y1@1_1=0y0q1D1$0/1a0N0!0t0J0^0s011{1Q010e0,0E0J1i0E1=2d2f2k1}2n1_2q0V2s040a0f0d0q0b0!0b0N0T1d1f0(2b0q0q0E0P2N1v2u0J1D0Y1$2Z2729281?0$2w1R0T0J2p2K1=1L1N0:1|2-2/0J0b2?1=0!2S1D2X2Z33102e1f2^2l2|0q140h1=0t1)2S0e0^030M0M0P2}0E1.2{0b0O0Z0O0u0}0u1v0t34370~362v391}3b3d3f3h0E3j013l3n3p3r2:3u0O2i040s3A3C2f3E2X2,013J0t3e1D3g0w3i3k3m3o0(3T2|3V0x0}0x3!2W3D0 3(3H0^3+3-053/3;3P3?3S2.3U3v0Z0}0Z3 1w413F381P3I0b3c3,3L3:3N3=3R3^4e3`3v0k0}0k4k3342373)464u4a3Q3@3q4A3t3v0D0}0D4G4m434p454r3K3.3M3O4O4d3s3V0S0}0S4X3$4I3G4!3*4$4t4(4v4*4c4z4-3v0g0}0g4=2Y4@4o2_4`4s47494w4b4y4Q520O0K0}0K572Z300E2Z2?2$0$292+44014P2=1M1D5r323D403$054P5G2v0T0$0^3m2X3V3x4(5O5Q5i3_4S3w2j2A0E5X4P5Z5T1=0Y3B4n3)0i0}0(0e5I2Y5:5z0A0}0f5_5M5a3a0e0}270T0M2.0N0E0q2V4l5J4Z5b0|040G605{4_0J650t1^0E0t0C6l6g2l6i0Q0l600 6e5`3(5W015R373V3X480f6G505j4f3W5$2r5)4,6R6L5.040f6#5 6w3I0}0J606%4J5z0b0}0B6,6m5b0J0p0}2z6v6.4_6i6k6D614K6p6r6t6}4^6h0}0Q6B781f6O0M5S3v3|5V5P6H5Y4R3{6T2B6V516R7k3!6$6-792l5=040e4r6?6(450}0T7G6~5b0b5}042.7L7A3I6`040q2f1X7e3)707!5z0V0T3y7%6 0}0o7S626)046+726@6x7b6A726C356F7m6I2f3V4h7l7t6Q4B3u7r5(7n5*7p4g5-3B7y7y7_7=0m7:3)6:046=727z7;7I7Q7d7^805X7i0O4D868d6W894D0f5%875+4C8h6!8j6#8l8w0z3,0E0C0q0M0t680J6a2S0q8o6/6;8+6n751_778z7M7`040F7,6^7J8{8^0L8y7 4J7g8C4U8F6P8N0O4U8K6U8G7u89967x8R8u5;0}0A1*1_8.8|048n8t8T018q020j0y0c9q2l7)0}0#9C1}7O0}2f0$9H8U8W8Y8!8$8(6b9N9w0}020h9A9V6o04246s6u8?7T0^6i8`9+8v3*0}9t339k8,040O9V9E043z9:7#0}0L7|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}a7817ha90O54ac8e5k54ag8c988fa.8Pan8kaXaPaC8-aW8@ayb3auaU9}7*9 915H8A7n8C5ma:8H5!5ma@8Ma`bham8jaG9%6q8;9*a#5zawa15zb0bA7-a%b18r9#0}8V1_9Q8#696b9Ua)7^0Y5L1G311v5u1v0y5wbZ2)2!bu5sbX5D1B735z2S0V0M0e0t0i0E0M0w7k1n1p1r1t0fa55H1I3E1C0R003,0j4r2M0w2B0f0$0C0f660f2e0q6N8%6b2N0f1t0y0f0C1fc9cb1$ce3H0Tb 0f0I2b0J2q0n270E0X5 c4b-0R3g8V0q0Tb)6N0P0T8K0b130v1`5K3p04bK8X8ZbNco8)1v5Lcr0Nct0N0b0C0z2pct2|c#c%5L0:0Ec;c)0X1G3E0Y0(0*0,0N04.
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
.128013oP;f 8lkg5:j+F,bry2a1éh3tvwT=u6e[(Sàn9]_s-c)7iqm/4p0d050#0G0z0u0U0h0P0f0R0h0u0P0P0D010z0U0Z010406050P0E0W0W0u0r0s040J0b0h0E0_0b0L050X101214160~0Z04051m1f1p0X1m0~0#0U0A0.0:0=0@0:0L0j0E0u0j0G0Q0Z0s0z0x1d0f0x0U0j0x0h1R0x0z0|050)0q0h0G1y0;0?011Q1S1U1S0z1!1$1Y0z0r1n1M0.190P0Z0u0L0@0t011(1A010e0+0G0L0u0W0G1Y1}1 241*271$2a2c0|0a0f0c0r0b0Z0b0P0U1c0L0f0%1{0r0r0G0R2x1f2f0L1n0X1M2K1@1_1^1Z0#2h1B0U0L292u1Y1v1x0/1)2U2W0L0b2!1Y0Z2D1n2I2K2;0 1~2y2$252*0r130h1Y0u1P2D0e0@030O0O0R2+0G1U2)0b0Q0k0Q0v0|0f0v1f0u2=2^0}2@2g2`1*2|2~30320G340136383a3c2X3f0Q22040f0t3m3o1 3q2I2T013v0u2 1n310x333537390%3F2*3H0y3j0y3N2H3p0~3R3t0@3U3W053Y3!3B3$3E2V3G3g0Y3j0Y3/1g3;3r2_1z3u0b2}3V3x3Z3z3#3D3(413*3g0k3j0k472;3=2^3S3_4h3}3C3%3b4n3e3g0F3j0F4t493?4c3^4e3w3X3y3A4B403d3H0T3j0T4K3P4v3s4N3T4P4g4R4i4T3 4m4W3g0g3j0g4#2J4%4b2%4*4f3`3|4j3~4l4D4=0Q0M3j0M4`3Q4w3@4 4Q3{4S4k4C3)4F3h0!0|0v0!5c4|4x4+515j545l4E3H0v3i045D5t4a5v504z534U4;423h3J0v3M0X3n3:3P1q2/1f2!2N0#1_2S5f4C2Z1w1n2.0G2:3p5W2J054C5;2g0U0#0@372I5C3x5|5~555m610f2l0G645A575E3/4M4~0i0|0%0e5?5`4}250B3j6m5I5f0L0e0|1@0U0O0u0O0q0E0h1$0P6s6g250{040I6I5e4)0L0|1U0P0z0G6O4(4~6L0l6m0f6t6Q0q6S0U6U6X6o1*6L0S6#484$6.0f63015 2^3H3J5i6{4:565P22682b6a6|655B3g705U3K0f7h6(4~6R046y0G6W6@2J6%6J1*0b0|0D6$7j250i0R0|0o3V0P7p4u6_720O603g3,4R7K6c5P3,772c6b4V7S1Y7f7h7i7t3^0|1e7q3K7z7u7w7y7%3T6*042k6_5f6L6N7+7-7(7@6,6V7_4)6;6m0~7}3R7K7M0Q447P5}7a7R4o8c23697W5O8i8d3N7#7s6P6h0|0B1Q1$7:8t250b6q042*0z8z6Y2{6x0r0U7o836Z0|6?7I884w8a6~4p628f73668X7U798!7c3f7Z3n8r8r7~3T8K8M7H3p8s8I7.047x7+8_6/0@7B0|0C0r0E8@3P8 3S0R5E030f2v0f0u0E0R0E2y0w0R0x1 1H68000G6U0f3z2E0z0E0w867J8Z7L8W0Q4H8e8m748i4H8%9J8#9G8,3q8T5{9D8b4Y9I8g7X8i4Y9N9Z8n5n9X8q8.7$8A1*9b0|9d0c14390E0r0-2A0:0f6T6V0f0m0E0P0V0E000K9 000u0A1 0z2z0G0r0L8M0r0f0w0h0w2c0L8G7+872?899V9F4@9Y8)574@9%aB5Paz9,9-8:6i040e4e8H908;040UaP3S8C0|2VaU6u7?0r9p975@7;7{8O8J8EaZ4)7v040Qa/4~0W0U5qa,6:0|6=6$au5=aw648b59aA7b5759aEb85Pb6aI9-7#aKaX6l8~8:7la0a(6n3S6L0Ha|7 aTbl7;a;0na@25a_a{9TaQ6L0NbB8{020h0z0dbJ7 bobu01bsbS7lbwav9/0@bH8R49bF6`ax1 5C5pb78h5n5r8k789O8*b;2K8-bgb|8:9;049d9m9o1Dbpb15Xb37a8b5D8Yb@6d3ibbb/5C6e7!b|bgbm6+6Ubp8:bUb(6uaXbSbH0pbVco82ct840|btcC7kcvbxbZ01bzbP01bD5Fcw0|bIcJ8`0@a;8}2;99cu80cpcR04cFbYcVaRbX8^8:cMcUaQcP3lcG6KcScyc_3ucAcqa*cEczaSc(cT8Sc+2y8Vb+3g5Scc9(9Kb:768ldf9Pddb`7gcl8.cn7m8L8Nc=aV7/dv5f92047E0,bpc!4)b c19na%0p2z1d0R9 811%2*2y6y0wc56s0X5_5Y5:5!5-1f0z5%d(2Q2L0u1#d#0X5#870%0)0+0P04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)