Vous êtes sur la page 1sur 6

TP encadré de l’étudiant

Algorithmes de tri
Durée : 04h

1 Compréhension des algorithmes de tri


Soit le tableau
A = [6, 10, 3, 0, -5, 15, 2].
Donner les tableaux obtenus à chacune des itérations de l’exécution des algorithmes de tri par
sélection, tri par bulle, tri par insertion, tri par fusion et tri rapide.
1. Tri par sélection :
La méthode de tri par sélection est une méthode qui consiste à sélectionner chaque fois, le
plus petit élément de la partie non-triée de A et de positionner cet élément à l’extrémité
de la partie triée de A, tout en maintenant cette dernière partie triée.
A un moment donné nous avons donc déjà trié un préfixe du tableau : A [0..i[. La
partie A[i..n[ est encore non triée. Il s’agit alors de sélectionner le plus petit élément de
A[i..n[, et de positionner cet élément en A[i]. Pour cela, il nous faut d’abord trouver
l’indice j du plus petit élément de A[i..n[, puis il nous faudra permuter les éléments
A[i] et A[j].

2. Tri par bulle :


La méthode du tri par bulle consiste à parcourir un tableau dans l’ordre croissant des
indices, tout en permutant systématiquement toute paire d’éléments consécutifs qui ne
sont pas dans l’ordre croissant. Si au cours d’un parcours, au moins une permutation a
été faite, on parcours à nouveau le tableau en effectuant les permutations.

3. Tri par insertion :


La méthode du tri par insertion consiste à parcourir le tableau A dans l’ordre croissant
des indices, et à insérer dans la partie triée de ce tableau, les éléments récupérés en par-
courant ce tableau. La partie triée doit être maintenue triée.

4. Tri par fusion (ou ségmentation) :


La méthode du tri par fusion est une méthode récursive de tri qui consiste à diviser le
tableau à trié en deux sous-tableaux qui seront séparément triées. On fusionne alors ces
deux sous-tableaux triées.
Pour éviter de créer des tableaux supplémentaires lors des divisions de tableaux, nous
allons implémenter cette méthode en place. Nous allons chaque fois donner les positions
de début et fin des sous-tableaux à trier.

5. Tri rapide :
La méthode du tri rapide est une méthode récursive de tri qui consiste à positionner défi-
nitivement un élément du tableau, choisi comme pivot, de manière que tous les éléments

1
de sa gauche lui soient inférieurs et tous les éléments de sa droite lui soient supérieurs.
Nous choisissons que le pivot soit le premier élément du tableau.

2 Programmation
Consigne : Vous devez choisir et trairer quatres exercices. Les exercices supplémen-
taires seront considérés comme des exercices donnant des notes de bonification.

Exercice 1.
Ecrire un programme demandant à l’utilisateur de donner un entier positif n correspondant à
la taille de deux tableaux A et B.
Après avoir créer ces deux tableaux, le programme utilise alors une fonction initTab afin
d’initialiser successivement ces deux tableaux :

void initTab(int tab[], int n);

Le programme utilise ensuite une autre fonction produitScalaire pour calculer le produit
scalaire des tableaux :

int produitScalaire(int A[], int B[], int n) ;

Si A = [2, 3, 4] et B = [4, −3, 6], leur produit scalaire est l’entier 2 ∗ 4 + 3 ∗ (−3) + 4 ∗ 6.

Exercice 2.
Ecrire une fonction polynome qui permet de calculer l’image en t du polynôme

P (x) = A[0] + A[1] ∗ X + A[2] ∗ X 2 + ... + A[n − 1] ∗ X n−1

int polynome(int A[], int n, int t) ;


Par exemple si A = [2, 5, −9] et t = 3, la fonction calcule P (3) = 2 + 5 ∗ (3) + −9 ∗ (3)2 .

Vous ne devez utiliser que votre propre fonction puissance pour calculer les puissances X m :

int puissance(int X, int m) ;

Ecrire alors un programme permettant de tester la fonction polynome. Le programme donne la


possibilité à l’utilisateur de choisir lui même le degré du polynôme qu’il souhaite.

Exercice 3.
Ecrire un programme qui permet à l’utilisateur de saisir deux matrices carrées quelconques A
et B. Le programme demande pour cela le nombre de lignes et celui des colonnes de la matrice
A, puis permet à l’utilisateur de saisir cette matrice. Il fait de même pour la matrice B. Le
programme calcule alors le produit A ∗ B et/ou B ∗ A, quand cela est possible.

2
Exercice 4. (La recherche des éléments identiques)
Ecrire une fonction en langage C qui demande à l’utilisateur de donner un nombre entier n
désignant la taille d’un tableau d’entiers. La fonction effectue alors les actions suivantes :
1. Remplir le tableau en demandant à l’utilisateur de donner ces éléments. Par exemple si
n = 3 et que l’utilisateur donne les éléments successifs 1, 2 et 3, le remplissage se fera
suivant le format d’affichage :
Donner maintenant les éléments du tableau :
tab[0] = 1,
tab[1] = 2,
tab[2] = 3.
2. La fonction demande ensuite à l’utilisateur de lui donner une valeur x qu’il recherchera
dans le tableau.
3. La fonction affiche enfin le nombre d’occurrences de x dans le tableau ainsi que les posi-
tions de ces éléments. Par exemple, si l’utilisateur rentre le tableau

tab = [1, 2, 3, 7, 2, 9, 10, -4, 4, 2]


et que l’utilisateur donne la valeur 2, alors le programme lui affichera

nbValeur = 3, positionsCorrespondantes = [1, 4, 9]


4. La fonction rend finalement comme résultat, le nombre d’occurrences qui a été trouvés.

Exercice 5. (Réunion de deux tableaux triés)


Ecrire une fonction en langage C qui demande à l’utilisateur de donner deux tableaux d’entiers
qui sont triés en ordre croissant, puis qui détermine la réunion de ces tableaux. Par exemple,
si l’utilisateur rentre les tableaux

A = [1, 2, 3, 5, 7] B = [1, 3, 4, 6, 7, 9]
La fonction calcule le tableau

C = [1, 2, 3, 4, 5, 6, 7, 9]
La signature du programme est la suivante
int myunion(int A[], int tailleA, int B[], int tailleB, int C[])

La fonction rend donc comme résultat, la taille réelle du tableau C.


Exercice 6.
Ecrire un programme en langage C++ qui demande à l’utilisateur de donner un nombre entier
n désignant la taille d’un tableau d’entiers. Le programme effectue alors les actions suivantes :
1. Remplir le tableau en demandant à l’utilisateur de donner ces éléments. Par exemple si
n = 3 et que l’utilisateur donne les éléments successifs 1, 2 et 3, le remplissage se fera
suivant le format d’affichage :
Donner maintenant les éléments du tableau :

3
tab[0] = 1,
tab[1] = 2,
tab[2] = 3.
2. Le programme demande ensuite à l’utilisateur de lui donner une valeur x qu’il recherchera
dans le tableau.
3. Le programme affiche enfin le nombre d’occurrences de x dans le tableau ainsi que les
positions de ces éléments. Par exemple, si l’utilisateur rentre le tableau

tab = [1, 2, 3, 7, 2, 9, 10, -4, 4, 2]


et que l’utilisateur donne la valeur 2, alors le programme lui affichera

nbValeur = 3, positionsCorrespondantes = [1, 4, 9]

Exercice 7.
Ecrire un programme qui permet à l’utilisateur de saisir deux matrices carrées quelconques A
et B. Le programme demande pour cela le nombre de lignes et celui des colonnes de la matrice
A, puis permet à l’utilisateur de saisir cette matrice. Il fait de même pour la matrice B. Le
programme calcule alors le produit A ∗ B et/ou B ∗ A, quand cela est possible.

Exercice 8.
Ecrire un programme qui demande à l’utilisateur de donner le nombre de lignes et de colonnes
d’un tableau réels. Ce programme demande alors à l’utilisateur de remplir le tableau en affichant
des messages de la forme :

Donner S.V.P. le réel de la ligne i et de la colonne j :

i et j devant être remplacés dans ces messages par les valeurs correspondantes.
Le programme affiche finalement le tableau en affichant également la moyenne des éléments de
chaque ligne, de chaque colonne et la moyenne globale.
Pour un tableau de 3 lignes et de 3 colonnes :

1 3 5
2 7 6
3 2 4

on doit avoir l’affichage suivant :


1 3 5 3
2 7 6 5
3 2 4 3
2 4 5 3.66

4
Exercice 9.
La suite des nombres de Catalan (Cn )n≥1 est telle que



 C1 = 1

Cn =
 4n − 6
Cn = × Cn−1 , ∀n ≥ 1.



n
1. Ecrire une fonction qui demande à l’utilisateur de donner un entier naturel n ≥ 1 et qui
calcule puis affiche la valeur de Cn .
2. Ecrire une autre fonction qui calcule pour un entier naturel n ≥ 1, la valeur de
(2n − 2)!
Un = .
(n − 1)! n!
3. En déduire une fonction qui montre pour tout n ≥ 1 que Cn = Un . Pour cela, la fonction
demande n, calcule Cn et Un , puis vérifie si Cn == Un . Le programme affiche bien entendu,
chacune des valeurs calculées de Cn et de Un sous le format :

n Un Cn Cn == U n
1 1 1 true
.. .. .. ..
. . . .
4. Donner enfin une fonction qui permet de montrer pour tout n ≥ 1 que
4n−1
Cn ≤ .
n
Vous prendrez soin d’effectuer un affichage similaire à celui de la question précédente.
Exercice 10. La banque Azôwatò accorde un prêt à un client, si l’intérêt annuelle généré par
son compte épargne bloqué dépasse 100000. Le taux d’intérêt annuelle de cette banque est de
3.5%.
On vous demande d’écrire un programme en langage C++permettant de lire le montant initial
d’un compte d’épargne bloqué, puis de déterminer le nombre d’années au bout duquel le client
pourra bénéficier d’un prêt.

Par exemple, si le montant initial du compte est de 1000000, on a comme intérêts générés :
Année 1 : intérêt = 1000000 ∗ 0.035 = 35000.0
Année 2 : intérêt = 1035000 ∗ 0.035 = 36225.0
··· ···
Pour ce client, on arrête donc les itérations quand intérêt > 100000.
Exercice 11.
Ecrire un programme qui demande à l’utilisateur de rentrer un nombre réel x, sous le format
"S.V.P., Donner un nombre réel x : "
Le programme demande ensuite à l’utilisateur de donner un nombre entier naturel “n >= 0”.
Il demande alors à l’utilisateur de rentrer des nombres réels y jusqu’à ce que “y == x”. Le
programme ne fait au plus que n tests de vérification. Il affiche à chaque vérification erroné un
message de la forme :

5
— Si x < y : "La valeur de y est trop grande !"
— Si x > y : "La valeur de y est trop petite !"

Vous aimerez peut-être aussi