Aller au contenu

Tri de trois valeurs

Le tri du drapeau hollandais en bref

On l'utilise dans le cadre des tableaux ne contenant que trois valeurs distinctes (petite, moyenne et grande).

Il a pour avantage d'être de coût linéaire et de trier le tableau en un seul passage.

On partage le tableau en quatre zones :

  • les petites valeurs,
  • puis les valeurs moyennes,
  • puis les valeurs pas encore triées,
  • enfin les grandes valeurs.

Schéma

Schéma

L'algorithme s'arrête lorsque la zone des valeurs à trier est vide.

On souhaite trier un tableau ne contenant que trois valeurs a, b et c répétées un nombre quelconque de fois. On souhaite trier ce tableau afin de placer au début les a suivis des b et enfin des c.

Par exemple, avec nombres = [2, 0, 2, 1, 2, 1] on a a = 0, b = 1 et c = 2. Le tableau trié est [0, 1, 1, 2, 2, 2].

Dans ce cas de figure, on peut utiliser le tri du drapeau hollandais.

Remarque

Ce tri a été inventé par Edsger Dijkstra qui était de nationalité néelandaise.

Il a donné son nom à l'algorithme en référence aux trois couleurs du drapeau néerlandais : Rouge, Blanc, Bleu.

Drapeau hollandais

L'idée est de maintenir quatre zones dans le tableau :

  • la première ne contient que des a,
  • la deuxième que des b,
  • la troisième des valeurs pas encore triées,
  • enfin la dernière zone ne contient que des c.

Ces zones sont délimitées par les bornes suivantes (toutes incluses):

  1. de l'indice 0 à prochain_a - 1,
  2. de prochain_a à actuel,
  3. de actuel + 1 à prochain_c,
  4. de prochain_c + 1 à len(tableau) - 1

Les quatre zones Les quatre zones

L'algorithme fonctionne ainsi :

  • Les variables prochain_a et actuel sont initialisées à 0,

  • La variable prochain_c est initialisée à len(tableau) - 1,

  • On répète les actions suivantes tant que la zone des valeurs restant à trier est non vide :

    • On lit l'élément à l'indice actuel :

      • Si c'est un a, on le rajoute à la fin de la zone des a en échangeant les éléments d'indices prochain_a et actuel (étape 3 sur les figures),
      • Si c'est un b, on la laisse à sa position (étape 2 et 6),
      • Si c'est un c, on la place à la position précédant le début de la zone des c en échangeant les éléments d'indices prochain_c et actuel (étape 1, 4 et 5),
      • Dans tous les cas, on prend soin de mettre à jour les différents indices afin de refléter les nouvelles étendues des zones.

Les figures ci-dessous illustrent le tri du tableau [2, 0, 2, 1, 2, 1] :

  • Étape 1

    Étape 1 Étape 1

    On lit un 2 : on le place au début de la zone des c.

    prochain_c est décrémenté.⚓︎

    • Étape 2

    Étape 2 Étape 2

    On lit un 1 : on le laisse à cette position.

    actuel est incrémenté.


  • Étape 3

    Étape 3 Étape 3

    On lit un 0 : on le place à la fin de la zone des a.

    prochain_a et actuel sont incrémentés.


  • Étape 4

    Étape 4 Étape 4

    On lit un 2 : on le place au début de la zone des c.

    prochain_c est décrémenté.


  • Étape 5

    Étape 5 Étape 5

    On lit un 2 : on le place au début de la zone des c.

    prochain_c est décrémenté.


  • Étape 6

    Étape 6 Étape 6

    On lit un 1 : on le laisse à cette position.


  • Étape 7

    Étape 7 Étape 7

    actuel est strictement supérieur à prochain_c.

    L'algorithme se termine.

Vous devez écrire la fonction tri_3_valeurs qui prend en argument un tableau ainsi que les trois valeurs distinctes le composant a, b et c et le trie en place en positionnant les a au début suivis des b et enfin des c.

Contrainte

On interdit d'utiliser la méthode de tri sort et la fonction de tri native sorted.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013bqê,9vià3o_x;Hjlpwf( g0]6-)2s1+8ûené4è[Em5tCRPhk:c.a=ryDSIu/7d050.0I0R0!0h0q0D0v0Y0q0!0D0D0#010R0h0r010406050D0+0P0P0!0$0%040)0k0q0+120k0J0v020!0P0r0n0v0T0I1c0$0c0+0I0D050,191b1d1f170r04051K1D1N0,1K170.0h0g0`0|0~100V0h0w0V0q1#0V0R15050=0b0q0I1W0}0 011!1$1(1$0R1.1:1,0R0$1L0R0V0`1i0D0r0!0J100C011=1Y010t0@0I0J1q0I1,282a2f1@2i1:2l0P2n040a0v0U0$0k0r0k0D0h1l1n0:260$0$0I0Y2I1D2p0J1L0,242U2123221-0.2r101(0J2k2F1,1T1V0{1?2(0h2*0J0k2.1,0r2N1L2S2U2 18291n2:2g2^0$1c0q150v0E2R3316322q351@37393b0C3e2a3g2S2%013l0!3a040v0j3p2T173s3j103v3x0v0L3B3r333t3H3b0Q3L3D3N3F3u0k383w3b0z3S3h341X3k3X3m3y0-3$3E3)3G3+3Z3y0G3/3U3;3W3Y3I0f3`3i3|3P040E0x413(2;3}3,0E3d1E3f3T424a440E3o4f3q4h49363?3x0E3A4n3C3%3O4s150E3K4w3M4i4r3~4B3R4E1O2}1D2.2X0.232$3V0Y2_2x0/1U1L2|0I2~3f3L054V0:4%4G1@0W150:0t4)3:4a0s3b4@3{4j0t15210h0l0j0l0g3w0I0+0$1C4L4^2g14040u4|4.3G152^0P0b2N5b315d1@5f0B0X3S0v5y0v4y3V0J152|0k0Y0V0?0J0l0!3L5A5s100k150#5N5B3|0P0h15474E065z5O4}36150!2P1A0q5U5P015R045T4E5(5j015X5Z5x5z5V4j5E2C5H5J0l0Y5:5)1@5?5^2 5`4q3k0b152u5i6g105f5h5c6a5k045m5o1B6l3t5u695{5?0A6A6m5|5Y453S5$605;4:040s1!1:6E3O5+5-0I5/5_612g5?020q0R0n6d3f6f6T045F652?676x3V5f5w5#5%5%6Z4/150h4?6Y5;5D6t0k5n5p6?3|5f0N7962045,0R5.7d5e150y6S3V6c6*3q6,3V5}045!5r6r016^5 6{6{6}6s6u786q5{7b7j3k6U7h6W7L6n7l0e7n435l766v5q4(5;7K7I6F746/5I6;5M7%6y7l7U4a6c7;5*75776w7.6@157c7|7V6.647+5K7-7x7J7S7@7M7_7Y7Q7z7~8e747g7i804a5f7m6`7C7D73635G845L8a5Q150F7q2T7s5W6H4e2 6K8q6L7y8i6V6X6e7E5=8z8B3y8Q7u8G4g8J8Q6N6W708x3u7W7`7Z3q8Q7$877(7N8k8:7/048o8P5;7p8(8W8e7A8p8J5y8Q8M7O8O6+8Q5?8A8~8F7B8r7y8#0^0I90156_8H938K5{747G7{8@7}047 9v818j7P8l7k8_7T728L8*8d9D5t8g9L6s7*66689O8f8_8(7?9H9r9J7H9z8m9N9$7^9Q6;9S9)9M9F8(9s7X9#7!7y8/9^9Z7f8N9l9V9293958t6:5K9-998|150A8T8D4a8 5#1D4+4$4Maj0,4P1D0R4Rao2!2V0!1/al4P1J4-6F2N0P0l0t0!0W0I0l0V0j151v1x1z1B0v9n4(1Q3g1K0*0q0v0D000!0w2H0v0.0+0v5F1/0M2wa(a%a)5A1w040(0$0!0r0I0!a*0o1i0|0J0.0?5ba@0v2?0g2k0R0Ka+1d0v0O0Z0v0(0h0p0W0D210!bi1OaU040S1;510v0!a+0k59by560J0=0w1;0.000d21bI1;4V0H0R0v2)0K0?2N0v0;a(bw0$0h0I0$bSbwau1:a~bX1n0+1n0D58aX290~a#0I0Zbsaybva|b32abR0D1m0v1k0@0h0D0!2IbXbobS0h5Xbc1;0ibZ0_1~a}0+0m261r2F0K0_2K210kc90v561:59cvc9120J2P1Bb|aT17am0;0?0^04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013bqê,9vià3o_x;Hjlpwf( g0]6-)2s1+8ûené4è[Em5tCRPhk:c.a=ryDSIu/7d050.0I0R0!0h0q0D0v0Y0q0!0D0D0#010R0h0r010406050D0+0P0P0!0$0%040)0k0q0+120k0J0v020!0P0r0n0v0T0I1c0$0c0+0I0D050,191b1d1f170r04051K1D1N0,1K170.0h0g0`0|0~100V0h0w0V0q1#0V0R15050=0b0q0I1W0}0 011!1$1(1$0R1.1:1,0R0$1L0R0V0`1i0D0r0!0J100C011=1Y010t0@0I0J1q0I1,282a2f1@2i1:2l0P2n040a0v0U0$0k0r0k0D0h1l1n0:260$0$0I0Y2I1D2p0J1L0,242U2123221-0.2r101(0J2k2F1,1T1V0{1?2(0h2*0J0k2.1,0r2N1L2S2U2 18291n2:2g2^0$1c0q150v0E2R3316322q351@37393b0C3e2a3g2S2%013l0!3a040v0j3p2T173s3j103v3x0v0L3B3r333t3H3b0Q3L3D3N3F3u0k383w3b0z3S3h341X3k3X3m3y0-3$3E3)3G3+3Z3y0G3/3U3;3W3Y3I0f3`3i3|3P040E0x413(2;3}3,0E3d1E3f3T424a440E3o4f3q4h49363?3x0E3A4n3C3%3O4s150E3K4w3M4i4r3~4B3R4E1O2}1D2.2X0.232$3V0Y2_2x0/1U1L2|0I2~3f3L054V0:4%4G1@0W150:0t4)3:4a0s3b4@3{4j0t15210h0l0j0l0g3w0I0+0$1C4L4^2g14040u4|4.3G152^0P0b2N5b315d1@5f0B0X3S0v5y0v4y3V0J152|0k0Y0V0?0J0l0!3L5A5s100k150#5N5B3|0P0h15474E065z5O4}36150!2P1A0q5U5P015R045T4E5(5j015X5Z5x5z5V4j5E2C5H5J0l0Y5:5)1@5?5^2 5`4q3k0b152u5i6g105f5h5c6a5k045m5o1B6l3t5u695{5?0A6A6m5|5Y453S5$605;4:040s1!1:6E3O5+5-0I5/5_612g5?020q0R0n6d3f6f6T045F652?676x3V5f5w5#5%5%6Z4/150h4?6Y5;5D6t0k5n5p6?3|5f0N7962045,0R5.7d5e150y6S3V6c6*3q6,3V5}045!5r6r016^5 6{6{6}6s6u786q5{7b7j3k6U7h6W7L6n7l0e7n435l766v5q4(5;7K7I6F746/5I6;5M7%6y7l7U4a6c7;5*75776w7.6@157c7|7V6.647+5K7-7x7J7S7@7M7_7Y7Q7z7~8e747g7i804a5f7m6`7C7D73635G845L8a5Q150F7q2T7s5W6H4e2 6K8q6L7y8i6V6X6e7E5=8z8B3y8Q7u8G4g8J8Q6N6W708x3u7W7`7Z3q8Q7$877(7N8k8:7/048o8P5;7p8(8W8e7A8p8J5y8Q8M7O8O6+8Q5?8A8~8F7B8r7y8#0^0I90156_8H938K5{747G7{8@7}047 9v818j7P8l7k8_7T728L8*8d9D5t8g9L6s7*66689O8f8_8(7?9H9r9J7H9z8m9N9$7^9Q6;9S9)9M9F8(9s7X9#7!7y8/9^9Z7f8N9l9V9293958t6:5K9-998|150A8T8D4a8 5#1D4+4$4Maj0,4P1D0R4Rao2!2V0!1/al4P1J4-6F2N0P0l0t0!0W0I0l0V0j151v1x1z1B0v9n4(1Q3g1K0*0q0v0D000!0w2H0v0.0+0v5F1/0M2wa(a%a)5A1w040(0$0!0r0I0!a*0o1i0|0J0.0?5ba@0v2?0g2k0R0Ka+1d0v0O0Z0v0(0h0p0W0D210!bi1OaU040S1;510v0!a+0k59by560J0=0w1;0.000d21bI1;4V0H0R0v2)0K0?2N0v0;a(bw0$0h0I0$bSbwau1:a~bX1n0+1n0D58aX290~a#0I0Zbsaybva|b32abR0D1m0v1k0@0h0D0!2IbXbobS0h5Xbc1;0ibZ0_1~a}0+0m261r2F0K0_2K210kc90v561:59cvc9120J2P1Bb|aT17am0;0?0^04.