Professional Documents
Culture Documents
INF233 - Lecon 3
INF233 - Lecon 3
Rodrigue DJEUMEN
Sommaire
1 Sommaire
2 Notion de complexité
Dénitions
Ordre de grandeur
4 Algorithmes de tri
Tri par insertion
Tri par sélection
Tri par échange
Le tri rapide
Principe
Le partitionnement
Permute et acher
Quick sort
Analyse de complexité
Considérons le pire des cas : i.e. l'élément cherché est le dernier dans le
tableau
1 Par hypothèse, toutes les opérations élémentaires ont le même temps
d'exécution noté t.
1 Temps utilisé pour l'aectation : 1 × t ,
2 Temps de comparaison : égalité (N × t), inférieur (N × t + t),
3 Temps d'incrémentation (N × t),
4 Temps pour l'instruction return : 1 × t .
2 Complexité au pire des cas :
t + (N × t) + (N × t + t) + (N × t) + t = 3(N × t)+3
3 On constate dans ce cas que le temps d'exécution est fonction de la
taille N du tableau.
Ordre de grandeur
Traitement sélectif
Principe
Pour un vecteur donné, il s'agit d'une opération de recherche, permettant de ne
traiter que les éléments ayant une valeur particulière, sachant que cette valeur
peut apparaître zéro, une ou plusieurs fois dans le vecteur.
Recherche séquentielle
Principe
Cette opération de recherche suppose que l'élément cherché apparaît au plus une
et une seule fois dans le vecteur. Le parcours s'arrêtera dans deux cas :
Soit dès que l'on aura trouvé l'élément cherché,
Soit, lorsque l'on aura rencontré le dernier élément.
Exemple : Supposons que l'on dispose d'un vecteur vec contenant les
enregistrements d'informations sur les étudiants. Un étudiant est caractérisé par
son matricule , son nom et son pr énom ; écrire un programme permettant
d'acher les informations d'un étudiant de matricule mat donné, lu au clavier.
#define N 100;
typedef struct{
char matricule[6];
char nom[40];
char prenom[40];
}Etudiant;
int main(){
Etudiant vec[N]; char mat[6];
int i, TROUVE;
printf(Entrez le matricule de l'étudiant cherché);
mat = gets();
TROUVE = false;
i = 1;
while ((i <= N) && (!TROUVE)){
if (vec[i].matricule == mat){
puts(vec[i].matricule);
puts(vec[i].nom);
puts(vec[i].prénom);
TROUVE = vrai;
}
i++;
}
}
Exercice 2 : Montrer que la complexité au pire des cas de cet algorithme est de
l'ordre O(n).
Recherche dichotomique
Version itérative
Version récursive
Chaque valeur vec[i] est insérée à la bonne place parmi les valeurs déjà ordonnées du
sous-vecteur vec[1], . . . , vec[i − 1].
Au départ, ce sous-vecteur se réduit à vec[1] et on a i = 2.
Chaque insertion se fait par comparaisons et décalages successifs et a pour conséquence
d'agrandir le sous-vecteur ordonné d'un élément. La dernière insertion est celle de vec[n].
Principe
On parcourt le vecteur vec pour sélectionner l'élément ayant la plus faible valeur puis, on
échange sa valeur avec celle de V [0]. On procède ensuite de la même manière pour
vec[1], ..., vec{n − 1], puis vec[3], ..., vec[n], etc... jusqu'à vec[n − 2], vec[n − 1].
Principe
Les éléments du vecteur sont comparés deux à deux et permutés si
V [k] > V [k + 1]. le premier passage positionne le plus grand élément, le
deuxième positionne le deuxième plus grand, etc...
Permuter()