from random import randint
def fusion(L, p, q, r) :
L3 = []
i, j = p, q
# boucle posant en queue de L3
# les min des têtes des sous-listes L1, L2
while i < q and j < r :
if L[i] < L[j] :
L3.append(L[i])
i += 1
else :
L3.append(L[j])
j += 1
# une sous-liste étant vidée
# on colle tout le contenu
# non encore traité de l'autre sous-liste
# en queue de L3
if i == q :
for k in range(j, r) :
L3.append(L[k])
else :
for k in range(i, q) :
L3.append(L[k])
# on copie dans la liste L initiale
# la fusion obtenue :
for k in range(p, r) :
L[k] = L3[k-p]
def doublekTri(L,k) :
p = 0
q = min(p+k, len(L))
r = min( q+k, len(L))
while p < len(L)-1 :
fusion(L, p, q, r)
p = r
q = min(p+k, len(L))
r = min( q+k, len(L))
def trifusion(L) :
k = 1
while k < len(L) :
doublekTri(L,k)
k *= 2
# tirage au hasard d'une liste d'entiers de taille n
n = 10
L = [ randint(1, 3*n) for j in range(n) ]
print(L)
trifusion(L)
print(L)
from random import randint
def fusion(L, p, q, r) :
L3 = []
i, j = p, q
# boucle posant en queue de L3
# les min des têtes des sous-listes L1, L2
while i < q and j < r :
if L[i] < L[j] :
L3.append(L[i])
i += 1
else :
L3.append(L[j])
j += 1
# une sous-liste étant vidée
# on colle tout le contenu
# non encore traité de l'autre sous-liste
# en queue de L3
if i == q :
for k in range(j, r) :
L3.append(L[k])
else :
for k in range(i, q) :
L3.append(L[k])
# on copie dans la liste L initiale
# la fusion obtenue :
for k in range(p, r) :
L[k] = L3[k-p]
def doublekTri(L,k) :
p = 0
q = min(p+k, len(L))
r = min( q+k, len(L))
while p < len(L)-1 :
fusion(L, p, q, r)
p = r
q = min(p+k, len(L))
r = min( q+k, len(L))
print("Fusion des segments consécutifs de longueur {} : ".format(k))
for i in range(len(L)) :
if i % (2*k) == 2*k-1 :
print(L[i], end=' | ')
else : print(L[i], end=' ')
print()
def trifusion(L) :
k = 1
while k < len(L) :
doublekTri(L,k)
k *= 2
# tirage au hasard d'une liste d'entiers de taille n
n = 10
L = [ randint(1, 3*n) for j in range(n) ]
print("Liste avant tri : ", L)
print()
print("Etapes du tri : ")
trifusion(L)
print("\nAprès le tri : ", L)
On obtient par exemple :
Liste avant tri : [6, 5, 15, 28, 3, 10, 2, 23, 1, 28]
Etapes du tri :
Fusion des segments consécutifs de longueur 1 :
5 6 | 15 28 | 3 10 | 2 23 | 1 28 |
Fusion des segments consécutifs de longueur 2 :
5 6 15 28 | 2 3 10 23 | 1 28
Fusion des segments consécutifs de longueur 4 :
2 3 5 6 10 15 23 28 | 1 28
Fusion des segments consécutifs de longueur 8 :
1 2 3 5 6 10 15 23 28 28
Après le tri : [1, 2, 3, 5, 6, 10, 15, 23, 28, 28]