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