# Q1 Il y en a 5 :
# (0,2), (1,2), (1,3), (1,5), (4,5)
# Q2
def tri_bulle(L):
n = len(L)
for i in range(n-1, 0, -1):
for j in range(n-1, n-i-1, -1):
if L[j] < L[j-1]:
L[j], L[j-1] = L[j-1], L[j]
# Q4
def nombre_inversions(L):
L1 = L[:]
n = len(L1) compteur = 0
for i in range(n-1, 0, -1):
for j in range(n-1, n-i-1, -1):
if L1[j] < L1[j-1]:
compteur += 1
L1[j], L1[j-1] = L1[j-1], L1[j]
return compteur
def nombre_inversions_simplement(L):
n = len(L) compteur = 0
for i in range(n):
for j in range(i+1, n):
if L[j] < L[i]:
compteur += 1 return compteur
# Q5 [1,3,0,0,1,0]
# Q7
# Tab[0] est le nombre de j > 0 tels que
# s[0] > s[j]
1
# Les j en question sont donc les antécédents
# de 0, 1, ...,s(0) - 1
# Donc il y en a s[0]
# Q8
# Le cardinal est le même, n!
# Il suffit donc de montrer que Tab est injective.
# Q9
def permutation_vers_table(perm):
n = len(perm) tab = n*[0]
for i in range(n):
for j in range(i+1, n):
if perm[j] < perm[i]:
tab[i] += 1 return tab
# Q10
def table_vers_permutation(tab):
n = len(tab) perm = []
auxiliaire = [k for k in range(0, n)]
for i in range(n):
j = auxiliaire[tab[i]]
perm.append(j)
auxiliaire.remove(j) return perm
# Explications : auxiliaire contient les
# entiers s(i), s(i+1),..., s(n-1)
# rangés dans l'ordre croissant.
# tab[i] nous donne la position de
# s(i) parmi eux.
# Q10
2
def table_vers_permutation_bis(tab):
n = len(tab)
resultat = [k for k in range(n)]
for i in range(n - 1):
for j in range(i + tab[i], i, -1):
resultat[j], resultat[j-1] = resultat[j-1], resultat[j]
return resultat
L = [1,11,7,3,0,6,10,2,8,4,5,9]
L1 = [1,4,0,2,5,3]
3