Module diueil-TP_tris.tris
Expand source code
#!/usr/bin/python3
#-*- coding: utf8 -*-
import complexite_temps
######## outils #################################################################################
def isSorted(tab:list)->bool:
"""Fonction booléenne qui retourne True si le tableau passé en paramètre est trié"""
#Le booléen de sorite
isTrue = True
#La longueur du tableau
n=len(tab)
#Preconditions
assert isinstance(tab,list),"le paramètre n'est pas une liste"
#initialisation du compteur de boucle
i=0
while i<n-1:
#Invariant : le ième élément est inférieur au (i+1)ème
if tab[i]>tab[i+1]:
isTrue = False
i+=1
#Postconditions
#assert isTrue==True,"Le tableau n'est pas trié"
#En fait non sinon je ne peux pas m'en servir
return isTrue
def permuteTab_i_j(tab:list,i:int,j:int)->list:
"""Fonction qui permute les éléments i et j d'un tableau passé en paramètre"""
#La longueur du tableau
n=len(tab)
#Preconditions
assert n>0,"Le tableau est vide"
assert i in range(n),"i n'est pas un indice du tableau"
assert j in range(n),"j n'est pas un indice du tableau"
#variable tampon
temp = tab[i]
tab[i] = tab[j]
tab[j]= temp
#Postconditions
assert len(tab)==n,"Le nombre d'éléments du tableau a changé"
assert temp in tab,"tab[i] a disparu"
assert tab[i] in tab,"tab[j] a disparu"
return tab
######## fonctions de tri ###############################################################################
def tri_bulles(tab:list)->list:
"""Fonction de tri à bulles
`Paramètres`
* tab : Une liste.
`Sorties`
* le tableau trié
`Préconditions`
* Le tableau n'est pas vide
`Invariant`
* les éléments n-i à n sont triés
`Postconditions`
* le tableau est trié
`Exemples`
>>> my_tab_to_sort = [5,1,2,4,3]
[1,2,3,4,5]
"""
pass
# On récupère la taille du tableau dans une variable
n = len(tab)
#preconditions
assert isinstance(tab,list),"Le parametre n'est pas une liste"
assert n>0,"La liste est vide"
# On ne trie le tableau que s'il a plus qu'un seul élément
if n>=2 :
# Traverser tous les éléments du tableau
for i in range(n):
# INVARIANT :
# Les éléments n-i à n sont triés
#print("i=",i," : ",tab)
assert isSorted(tab[n-i:n]),"Le tableau n'est pas trié de n-i à n"
assert len(tab)==n,"Le nombre d'éléments du tableau a changé"
complexite_temps.compteTourBoucle() #espion
for j in range(0, n-i-1):
# Si l'élément trouvé est plus grand que le suivant on échange les deux
complexite_temps.compteTourBoucle() #espion
if tab[j] > tab[j+1] :
#tab[j], tab[j+1] = tab[j+1], tab[j]
permuteTab_i_j(tab,j,j+1)
#postconditions
assert len(tab)==n,"Le nombre d'éléments du tableau a changé"
assert isSorted(tab),"Le tableau n'est pas trié"
# il faudrait vérifier que les éléments sont restés ceux de départ peut être avec une fonction à part ?
return tab
def isGreater(x:int,y:int)->bool:
""" Fonction booléenne de comparaison"""
isGreater = False
if (x > y):
isGreater = True
else:
isGreater = False
return isGreater
def partition(tab, start, end):
while start < end:
# au debut de cette boucle, on partitionne avec start
complexite_temps.compteTourBoucle() #espion
while start < end:
complexite_temps.compteTourBoucle() #espion
if isGreater(tab[start], tab[end]):
(tab[start], tab[end]) = (tab[end], tab[start])
break
end = end - 1
# au debut de cette boucle, on partitionne avec end
while start < end:
complexite_temps.compteTourBoucle() #espion
if isGreater(tab[start], tab[end]):
(tab[start], tab[end]) = (tab[end], tab[start])
break
start = start + 1
return start
def tri_rapide_non_recursif(tab, start=None, end=None):
"""
Tri rapide non récursif.
**Paramètres**
* tab_source: une liste
* start : un entier par défaut à None
* end : un entier par défaut à None
**Sorties** Le tableau trié
"""
pass
# initialiser
if start is None: start = 0
if end is None: end = len(tab)
# Au départ l'indice de début et de fin utilisés pour partitionner sont différents
indiceStack = [start,end]
# Tant qu'ils sont différents on change l'indice du pivot
while len(indiceStack)>=2:
complexite_temps.compteTourBoucle() #espion
end = indiceStack.pop()
start = indiceStack.pop()
i_pivot = partition(tab, start, end-1)
if start < i_pivot:
indiceStack.append(start)
indiceStack.append(i_pivot)
if end > (i_pivot+1):
indiceStack.append(i_pivot+1)
indiceStack.append(end)
return tab
def tri_selection(tab:list)->list:
"""Fonction de tri par selection
`Paramètres`
* tab : Une liste.
`Sorties`
* le tableau trié
`Exemples`
>>> my_tab_to_sort = [5,1,2,4,3]
[1,2,3,4,5]
"""
pass
# Taille du tableau
n = len(tab)
# On ne trie le tableau que s'il a plus qu'un seul élément
if n>=2 :
# intialiser le compteur de boucle
i=0
while (i<=n-2):
# indice du plus petit élement restant
i_min = i
# initialiser le compteur de boucle pour les éléments du tableau restant
j=i+1
complexite_temps.compteTourBoucle() #espion
while (j<=n-1):
# si on trouve un plus petit élément on modifie l'indice i_min
complexite_temps.compteTourBoucle() #espion
if tab[j] < tab[i_min]:
i_min = j
# incrémenter le compteur boucle secondaire
j+=1
# si on a modifié i_min on échange les éléments
if (i_min != i):
permuteTab_i_j(tab,i,i_min)
# incrémenter le compteur boucle principale
i+=1
# on retourne le tableau trié
return tab
def tri_sort(tab:list)->list:
"""
mise en forme de la fonction sort pour effectuer le test de mesure de temps
"""
pass
tab.sort()
return tab
if __name__=="__main__":
# pour générer les csv
p=24 #exposant de puissance de 2 pour la taille des listes à trier
complexite_temps.genereToutesLesListes(1, pow(2,p))
#pour les tests
p=8 #exposant de puissance de 2 pour la taille des listes à trier
complexite_temps.mesure_temps(tri_rapide_non_recursif, pow(2,p), "tempsPivot.csv", "0aleatoire16777216.csv")
complexite_temps.mesure_complexite(tri_rapide_non_recursif, pow(2,p), "complexPivot.csv", "0aleatoire16777216.csv")
# complexite_temps.mesure_temps(tri_bulles, pow(2,p), "tempsBulles.csv", "0aleatoire16777216.csv")
# complexite_temps.mesure_complexite(tri_bulles, pow(2,p), "complexBulles.csv", "0aleatoire16777216.csv")
# complexite_temps.mesure_temps(tri_selection, pow(2,p), "tempsSelection.csv", "0aleatoire16777216.csv")
# complexite_temps.mesure_complexite(tri_selection, pow(2,p), "complexSelection.csv", "0aleatoire16777216.csv")
# complexite_temps.mesure_temps(tri_sort, pow(2,p), "tempsSort.csv", "0aleatoire16777216.csv")
# complexite_temps.mesure_complexite(tri_sort, pow(2,p), "complexSort.csv", "0aleatoire16777216.csv")
Functions
def isGreater(x: int, y: int) ‑> bool
-
Fonction booléenne de comparaison
Expand source code
def isGreater(x:int,y:int)->bool: """ Fonction booléenne de comparaison""" isGreater = False if (x > y): isGreater = True else: isGreater = False return isGreater
def isSorted(tab: list) ‑> bool
-
Fonction booléenne qui retourne True si le tableau passé en paramètre est trié
Expand source code
def isSorted(tab:list)->bool: """Fonction booléenne qui retourne True si le tableau passé en paramètre est trié""" #Le booléen de sorite isTrue = True #La longueur du tableau n=len(tab) #Preconditions assert isinstance(tab,list),"le paramètre n'est pas une liste" #initialisation du compteur de boucle i=0 while i<n-1: #Invariant : le ième élément est inférieur au (i+1)ème if tab[i]>tab[i+1]: isTrue = False i+=1 #Postconditions #assert isTrue==True,"Le tableau n'est pas trié" #En fait non sinon je ne peux pas m'en servir return isTrue
def partition(tab, start, end)
-
Expand source code
def partition(tab, start, end): while start < end: # au debut de cette boucle, on partitionne avec start complexite_temps.compteTourBoucle() #espion while start < end: complexite_temps.compteTourBoucle() #espion if isGreater(tab[start], tab[end]): (tab[start], tab[end]) = (tab[end], tab[start]) break end = end - 1 # au debut de cette boucle, on partitionne avec end while start < end: complexite_temps.compteTourBoucle() #espion if isGreater(tab[start], tab[end]): (tab[start], tab[end]) = (tab[end], tab[start]) break start = start + 1 return start
def permuteTab_i_j(tab: list, i: int, j: int) ‑> list
-
Fonction qui permute les éléments i et j d'un tableau passé en paramètre
Expand source code
def permuteTab_i_j(tab:list,i:int,j:int)->list: """Fonction qui permute les éléments i et j d'un tableau passé en paramètre""" #La longueur du tableau n=len(tab) #Preconditions assert n>0,"Le tableau est vide" assert i in range(n),"i n'est pas un indice du tableau" assert j in range(n),"j n'est pas un indice du tableau" #variable tampon temp = tab[i] tab[i] = tab[j] tab[j]= temp #Postconditions assert len(tab)==n,"Le nombre d'éléments du tableau a changé" assert temp in tab,"tab[i] a disparu" assert tab[i] in tab,"tab[j] a disparu" return tab
def tri_bulles(tab: list) ‑> list
-
Fonction de tri à bulles
Paramètres
* tab : Une liste.
Sorties
* le tableau trié
Préconditions
* Le tableau n'est pas vide
Invariant
* les éléments n-i à n sont triés
Postconditions
* le tableau est trié
Exemples
>>> my_tab_to_sort = [5,1,2,4,3] [1,2,3,4,5]
Expand source code
def tri_bulles(tab:list)->list: """Fonction de tri à bulles `Paramètres` * tab : Une liste. `Sorties` * le tableau trié `Préconditions` * Le tableau n'est pas vide `Invariant` * les éléments n-i à n sont triés `Postconditions` * le tableau est trié `Exemples` >>> my_tab_to_sort = [5,1,2,4,3] [1,2,3,4,5] """ pass # On récupère la taille du tableau dans une variable n = len(tab) #preconditions assert isinstance(tab,list),"Le parametre n'est pas une liste" assert n>0,"La liste est vide" # On ne trie le tableau que s'il a plus qu'un seul élément if n>=2 : # Traverser tous les éléments du tableau for i in range(n): # INVARIANT : # Les éléments n-i à n sont triés #print("i=",i," : ",tab) assert isSorted(tab[n-i:n]),"Le tableau n'est pas trié de n-i à n" assert len(tab)==n,"Le nombre d'éléments du tableau a changé" complexite_temps.compteTourBoucle() #espion for j in range(0, n-i-1): # Si l'élément trouvé est plus grand que le suivant on échange les deux complexite_temps.compteTourBoucle() #espion if tab[j] > tab[j+1] : #tab[j], tab[j+1] = tab[j+1], tab[j] permuteTab_i_j(tab,j,j+1) #postconditions assert len(tab)==n,"Le nombre d'éléments du tableau a changé" assert isSorted(tab),"Le tableau n'est pas trié" # il faudrait vérifier que les éléments sont restés ceux de départ peut être avec une fonction à part ? return tab
def tri_rapide_non_recursif(tab, start=None, end=None)
-
Tri rapide non récursif.
Paramètres
- tab_source: une liste
- start : un entier par défaut à None
- end : un entier par défaut à None
Sorties Le tableau trié
Expand source code
def tri_rapide_non_recursif(tab, start=None, end=None): """ Tri rapide non récursif. **Paramètres** * tab_source: une liste * start : un entier par défaut à None * end : un entier par défaut à None **Sorties** Le tableau trié """ pass # initialiser if start is None: start = 0 if end is None: end = len(tab) # Au départ l'indice de début et de fin utilisés pour partitionner sont différents indiceStack = [start,end] # Tant qu'ils sont différents on change l'indice du pivot while len(indiceStack)>=2: complexite_temps.compteTourBoucle() #espion end = indiceStack.pop() start = indiceStack.pop() i_pivot = partition(tab, start, end-1) if start < i_pivot: indiceStack.append(start) indiceStack.append(i_pivot) if end > (i_pivot+1): indiceStack.append(i_pivot+1) indiceStack.append(end) return tab
def tri_selection(tab: list) ‑> list
-
Fonction de tri par selection
Paramètres
* tab : Une liste.
Sorties
* le tableau trié
Exemples
>>> my_tab_to_sort = [5,1,2,4,3] [1,2,3,4,5]
Expand source code
def tri_selection(tab:list)->list: """Fonction de tri par selection `Paramètres` * tab : Une liste. `Sorties` * le tableau trié `Exemples` >>> my_tab_to_sort = [5,1,2,4,3] [1,2,3,4,5] """ pass # Taille du tableau n = len(tab) # On ne trie le tableau que s'il a plus qu'un seul élément if n>=2 : # intialiser le compteur de boucle i=0 while (i<=n-2): # indice du plus petit élement restant i_min = i # initialiser le compteur de boucle pour les éléments du tableau restant j=i+1 complexite_temps.compteTourBoucle() #espion while (j<=n-1): # si on trouve un plus petit élément on modifie l'indice i_min complexite_temps.compteTourBoucle() #espion if tab[j] < tab[i_min]: i_min = j # incrémenter le compteur boucle secondaire j+=1 # si on a modifié i_min on échange les éléments if (i_min != i): permuteTab_i_j(tab,i,i_min) # incrémenter le compteur boucle principale i+=1 # on retourne le tableau trié return tab
def tri_sort(tab: list) ‑> list
-
mise en forme de la fonction sort pour effectuer le test de mesure de temps
Expand source code
def tri_sort(tab:list)->list: """ mise en forme de la fonction sort pour effectuer le test de mesure de temps """ pass tab.sort() return tab