Inversions dans un tableau (1)

On considère dans cet exercice des tableaux d'entiers.

Soit tab un tel tableau. On appelle inversion un couple d'indices distincts i et j tel que :

  • i est plus petit que j ;
  • tab[i] est strictement plus grand que tab[j].

Considérons par exemple dans le tableau :

🐍 Script Python
# indices  0  1  2  3
tab     = [7, 5, 9, 6]

Ce tableau compte 3 inversions :

  • pour les indices 0 et 1, car tab[0] (qui vaut 7) est strictement supérieur à tab[1] (qui vaut 5),
  • pour les indices 0 et 3, car tab[0] (qui vaut 7) est strictement supérieur à tab[3] (qui vaut 6),
  • pour les indices 2 et 3, car tab[2] (qui vaut 9) est strictement supérieur à tab[3] (qui vaut 6).

Remarque

Compter les inversions dans un tableau permet de mesurer son « désordre » : si un tableau ne comporte aucune inversion, il est trié dans l'ordre croissant !

On demande d'écrire la fonction inversions qui prend en argument un tableau d'entiers et renvoie son nombre d'inversions.

On convient qu'un tableau vide ne compte aucune inversion.

Les tableaux utilisés dans les tests seront de petite taille (100 éléments au maximum).

Exemples
>>> inversions([])
0
>>> inversions([5, 6, 7, 9])
0
>>> inversions([7, 5, 9, 6])
3
###(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
.128013s3_8èufvIy n7aS1me(P24:jtwi][h)6Oo;bcdg/0làqp.rFL-,=+k95Rxé050M0s0z0o0B0Q0b0l0L0Q0o0b0b0!010z0B0T010406050b0g0r0r0o0V0k040p0I0Q0g0 0I0m0l020o0r0T0J0l0)0s190V0S0g0s0b050O16181a1c140T041A1H051K0O1K1M1H140M0B0i0@0_0{0}0E0B0N0E0Q1!0E0z12050/0K0Q0s1V0`0|011Z1#1%1#0z1-1/1+0z0K0I0M1c1,0V1I0z0E0@1f0b0T0o0m0}0v011;1X010h0;0s0m1n0s1+2c2e2j1?2m1/2p0r2r040a0l0u0V0I0T0I0b0B1i1k0-2a0V0V0s0L2M1A2t0m1I0O282Y0z2625270M2v0}1%0m2o2J1+1S1U0^1=2,0B2.0m221T1+0T2R1I2W2Y33152d1k2@2k2|0V190Q120q2V3713362u391?3b3d120v3h2e3j2W2+013o0o3e040c3s2X143v3m0}3y3A0w3D3u373w3J120(3M3F3O3H3x0I3c3z120G3T3k381W3n3Y3p040n3%3G3*3I3,3!040e3:3V3=3X3Z3A0%3M1J311A2=2#0M2)3w0L222B0,1T1I300s323i424b0-4j3l3}0$120-0h423;2^010A120l4v3|4x0m0h122`0i0s0V2K1j1z1B4k4w2k11040t4C4p4E121}0s0o0g4W3)4x4T0F0x3T0l4/4B4R3n4Z0I0/0Q3M4;4D2k0I120!4{3(3w0r0B120P4.4:533W0m4Z0:0Q1/524=0}4 04514P3t4|4X3a0K122y4(3w4T4V5o2X5b3}5d044!4$5w3W4+594/5C4x4r040h3Y5i4}4?040B5T5r1?0I4z5W0m5Y4)5s120V2e0N0s5I3}5y5;4Y5F5f5h5A045q5*5!120Y5)5456043g5|5N4S124,5L4:5M5j015P5R0V635c120y6l3}5#4H5(5|5~3P5t045-0m5/5@6a4U6C5V5X6u6960040#6p4x553f6F0}4T0Z6N3a5e0;5{356g4+4-5|066e6*5a6g5P0B4u6I6g5E5G4%686#120D6R3x4H6}4T0C6V6K020N0z0J733I5e1.4#6^6!5U6S6{6}5E6o6_7g01716%336)6+7t6f7n6?4^3z79015l0#5n336v3W6P663T7s7v5Z0}5P2R0z0g0V6t7F6J7a5F7y4`6(1A4m4i437(0O461A0z487-2%2Z21232#0o7c2Y461G4o5 0}2R0r0d0h0o0$0s0d0E0c121s1u1w1y0l7q4k1N3j1H0H1k1h0;0B0b1:0g2.0l0M0I0g7c0l210g0^1:0x0l1j2a1o1a1:0L0E0o8e0l0+0Q0+2A0m0z8v002`1S0L1:057%5W7$4c5}0o4J0L0l0z8x0?1/0?8R8T2o0z0?161T2e8|8X8Z0B8#4B8(7l8(0U0l0p0B968+1-0D0y720O8(0l1y8W0b2$940z1t8{0l2`0h0+0V0B0s7S0l0R9e4n9g0B9j9l8H9n0l84959E8t1:4I4K4M1k8F8H2`0L0V8`8V1:3z3Y8?8L0I1o9s7S0U1J8k040W0o0L2n9D2a0m8#0i0I0B0V0@0.9s0l0r0+284c0l0o0l8t8v0+0b8-900o5/8g9m5g1:0s0h0h2S7R1:0K7d4b0g0T8v9,8J5-8q4N9a0u1a9m0*1t0T1/0Z0l2I9Caf6@aC8v0B0*8Q8S8U8|aQ1/aR819Aa38r5-8I2d9#ac0gaZ0%0l8~0i900ba(1:0-a@0B0f2Aa?0l0ea`0g8 8Va~0la)2$a12Kb49(0g0l0nb9bb91051t040.0L1Abs0U060j0Q0l0ka?a/4$8:7Z0l0(0(a:1a0:0baH9=7}0X9,1haW8#1|1:a8aa2O9M1w0o0M5-0 8P951w9d9M0T0+2p1%ai8Va`9d0Q008HbP0g8N2L1:b}8ob^4KaR8xa32O0N6z0M0?6@0*9;8j147+0.5f0b04.