PC* while ielse: if i==n1: while j

publicité
Algorithmes de tris
PC*
Exemples d'algorithmes :
#On remet les fonctions nécessaires au tri −fusion puis on dénit
#une première fonction médiane écrite directement.
def Fusionner(a,b):
i =j=0
n1,n2,n=len(a),len(b) , len (a)+len(b)
L=[]
while i< n1 and j< n2:
if a [ i ] <=b[j]:
L.append(a[i])
i =i+1
else :
L.append(b[j])
if
j =j+1
i ==n1:
while j < n2:
L.append(b[j])
j =j+1
else :
while i<n1:
L.append(a[i])
i =i+1
return (L)
def Tri_fusion(a):
N=len(a)
if
N <=1:
return a
else :
m=N//2
a1=Tri_fusion(a[0:m])
a2=Tri_fusion(a[m:N])
return Fusionner(a1,a2)
def mediane(L):
n=len(L)
Python
L1=Tri_fusion(L)
return L1[n//2]
#On décortique les phases du programme qui seront ensuite regroupées
#On commence par des paquets de taille au plus 5.
Tri fusion 1
Algorithmes de tris
PC*
def mediane_petit(a):
n=len(a)
for
i
in
range(n):
v=a[i]
j =i
while j>0 and a[j-1]>v:
a [ j ] =a[j-1 ]
j =j-1
a [ j ] =v
return a[n//2]
#On obtient de manière récursive la médiane des médianes.
def liste_medianes(a):
L=[]
n=len(a)
i =0
while i+5<n:
L.append(mediane_petit(a[i:i+5]))
i =i+5
L.append(mediane_petit(a[i:n]))
return L
def mediane_medianes(a):
while len(a)!=1:
a=liste_medianes(a)
return a[0]
def echange(a,i , j ) :
a [ i ] , a [ j ] =a[j ] , a [ i ]
def premier_tri(a):
pivot=mediane_medianes(a)
k=0
for
i
if
in
range(1, len (a)) :
a [ i ] <pivot:
k=k+1
Python
if
echange(a,k, i )
0 ! =k:
echange(a,0,k)
return k
Tri fusion 2
Algorithmes de tris
PC*
# Pour crer une liste et acher sa méthode
#avec la méthode directe après tri −fusion.
def Essai(n) :
L=[]
for
k
in
range(n):
L.append(randint(0,2*n))
print('mediane=',mediane(L))
print('autre=' , premier_tri(L))
return(L)
#Version nale: la bonne idée est en fait de programmer récursivement le
#k−ème élément dans l'odre croissant d'une liste.
def valeur_indice_petit(a,k):
n=len(a)
for
i
in
range(n):
v=a[i]
j =i
while j>0 and a[j-1]>v:
a [ j ] =a[j-1 ]
j =j-1
a [ j ] =v
return a[k]
#si k=n//2 on retrouve la médiane
#Cette procédure utilisée pour des paquets avec n<=5
#peut être considérée à cou^t constant.
def Premier_tri(a,Val):
Gauche=[]
Droite=[]
for
x
if
in
a:
x < Val:
elif
Gauche.append(x)
x >=Val:
Droite.append(x)
Python
return len(Gauche), Gauche, Droite
#PROGRAMME PRINCIPAL FINAL
def valeur_indice(a,k) :
if k>= len(a):
raise ValueError('position
elif len (a)<=5:
demandée extérieure à la
Tri fusion 3
liste ' )
Algorithmes de tris
PC*
return valeur_indice_petit(a,k)
else :
Sto=[]
q=len(a)//5
r=len(a)-5*q
for
if
i
in
range(0,q) :
Sto.append(valeur_indice_petit(a[5*i:5*i+5],2))
r>0:
Sto.append(valeur_indice_petit(a[5*q:5*q+r],r//2))
Pseudo=valeur_indice(Sto,len(Sto)//2)
K,inf , sup=Premier_tri(a,Pseudo)
if
K==k:
Python
elif
return Pseudo
K>k:
return valeur_indice(inf,k)
else :
return valeur_indice(sup,k-K)
Tri fusion 4
Téléchargement