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
.128013:Lp(40ed3; 1jo5_n)h]6,qc[yFuvà8i2+xms7=wlSIatf-9ORrg.éPkbè/050i0h0T0S0G0P0L0l0y0P0S0L0L0N010T0G0d010406050L0C0K0K0S0Z0A040Q0o0P0C0 0o0r0l020S0K0d0k0l0Y0h190Z0x0C0h0L050+16181a1c140d041A1H051K0+1K1M1H140i0G0D0@0_0{0}0t0G0!0t0P1!0t0T12050/0)0P0h1V0`0|011Z1#1%1#0T1-1/1+0T0)0o0i1c1,0Z1I0T0t0@1f0L0d0S0r0}0H011;1X010U0;0h0r1n0h1+2c2e2j1?2m1/2p0K2r040a0l0%0Z0o0d0o0L0G1i1k0-2a0Z0Z0h0y2M1A2t0r1I0+282Y0T2625270i2v0}1%0r2o2J1+1S1U0^1=2,0G2.0r221T1+0d2R1I2W2Y33152d1k2@2k2|0Z190P120m2V3713362u391?3b3d120H3h2e3j2W2+013o0S3e040j3s2X143v3m0}3y3A0f3D3u373w3J120p3M3F3O3H3x0o3c3z120v3T3k381W3n3Y3p040M3%3G3*3I3,3!040F3:3V3=3X3Z3A0W3M1J311A2=2#0i2)3w0y222B0,1T1I300h323i424b0-4j3l3}0(120-0U423;2^010O120l4v3|4x0r0U122`0D0h0Z2K1j1z1B4k4w2k11040e4C4p4E121}0h0S0C4W3)4x4T0s0b3T0l4/4B4R3n4Z0o0/0P3M4;4D2k0o120N4{3(3w0K0G120g4.4:533W0r4Z0:0P1/524=0}4 04514P3t4|4X3a0)122y4(3w4T4V5o2X5b3}5d044!4$5w3W4+594/5C4x4r040U3Y5i4}4?040G5T5r1?0o4z5W0r5Y4)5s120Z2e0!0h5I3}5y5;4Y5F5f5h5A045q5*5!120V5)5456043g5|5N4S124,5L4:5M5j015P5R0Z635c120n6l3}5#4H5(5|5~3P5t045-0r5/5@6a4U6C5V5X6u6960040I6p4x553f6F0}4T0w6N3a5e0;5{356g4+4-5|066e6*5a6g5P0G4u6I6g5E5G4%686#120z6R3x4H6}4T0u6V6K020!0T0k733I5e1.4#6^6!5U6S6{6}5E6o6_7g01716%336)6+7t6f7n6?4^3z79015l0I5n336v3W6P663T7s7v5Z0}5P2R0T0C0Z6t7F6J7a5F7y4`6(1A4m4i437(0+461A0T487-2%2Z21232#0S7c2Y461G4o5 0}2R0K0q0U0S0(0h0q0t0j121s1u1w1y0l7q4k1N3j1H0X1k1h0;0G0L1:0C2.0l0i0o0C7c0l210C0^1:0b0l1j2a1o1a1:0y0t0S8e0l0$0P0$2A0r0T8v002`1S0y1:057%5W7$4c5}0S4J0y0l0T8x0?1/0?8R8T2o0T0?161T2e8|8X8Z0G8#4B8(7l8(0#0l0Q0G968+1-0z0n720+8(0l1y8W0L2$940T1t8{0l2`0U0$0Z0G0h7S0l0E9e4n9g0G9j9l8H9n0l84959E8t1:4I4K4M1k8F8H2`0y0Z8`8V1:3z3Y8?8L0o1o9s7S0#1J8k040B0S0y2n9D2a0r8#0D0o0G0Z0@0.9s0l0K0$284c0l0S0l8t8v0$0L8-900S5/8g9m5g1:0h0U0U2S7R1:0)7d4b0C0d8v9,8J5-8q4N9a0%1a9m0J1t0d1/0w0l2I9Caf6@aC8v0G0J8Q8S8U8|aQ1/aR819Aa38r5-8I2d9#ac0CaZ0W0l8~0D900La(1:0-a@0G0*2Aa?0l0Fa`0C8 8Va~0la)2$a12Kb49(0C0l0Mb9bb91051t040.0y1Abs0#060R0P0l0Aa?a/4$8:7Z0l0p0pa:1a0:0LaH9=7}0c9,1haW8#1|1:a8aa2O9M1w0S0i5-0 8P951w9d9M0d0$2p1%ai8Va`9d0P008HbP0C8N2L1:b}8ob^4KaR8xa32O0!6z0i0?6@0J9;8j147+0.5f0L04.