Vous êtes sur la page 1sur 11

Rapport TP 4 du module Algorithmique et compléxité

Fait par le binome : Kartout Abdel Moumen && Zaid Anis du Groupe 3 RSD

1) Tri à bulles
#include <stdio.h>

// Fonction pour échanger deux éléments

void Permuter(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

// Algorithme TriBulle

void TriBulle(int T[], int n) {

int Changement = 1; // vrai

while (Changement) {

Changement = 0; // faux

for (int i = 0; i < n - 1; i++) {

if (T[i] > T[i + 1]) {

Permuter(&T[i], &T[i + 1]);

Changement = 1; // vrai
}

// Algorithme TriBulleOpt

void TriBulleOpt(int T[], int n) {

int Changement = 1; // vrai

int m = n - 1;

while (Changement) {

Changement = 0; // faux

for (int i = 0; i < m; i++) {

if (T[i] > T[i + 1]) {

Permuter(&T[i], &T[i + 1]);

Changement = 1; // vrai

m--; // Réduire la plage pour la prochaine itération

// Fonction pour afficher un tableau

void printArray(int T[], int size) {

for (int i = 0; i < size; i++)

printf("%d ", T[i]);


printf("\n");

int main() {

int arr[] = {64, 25, 12, 22, 11};

int n = sizeof(arr) / sizeof(arr[0]);

printf("Tableau original : \n");

printArray(arr, n);

TriBulle(arr, n);

printf("Tableau trié avec TriBulle : \n");

printArray(arr, n);

int arrOpt[] = {64, 25, 12, 22, 11};

printf("Tableau original pour TriBulleOpt : \n");

printArray(arrOpt, n);

TriBulleOpt(arrOpt, n);

printf("Tableau trié avec TriBulleOpt : \n");

printArray(arrOpt, n);
return 0;

2. Tri Gnome

#include <stdio.h>

// Fonction pour échanger deux éléments

void Permuter(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

// Algorithme de tri Gnome

void TriGnome(int T[], int n) {

int i = 0;

while (i < n) {

if (i == 0 || T[i] >= T[i - 1]) {

i++; // Déplacement vers la fin

} else {

Permuter(&T[i], &T[i - 1]);

i--; // Déplacement vers le début

}
}

// Fonction pour afficher un tableau

void printArray(int T[], int size) {

for (int i = 0; i < size; i++)

printf("%d ", T[i]);

printf("\n");

int main() {

int arr[] = {64, 25, 12, 22, 11};

int n = sizeof(arr) / sizeof(arr[0]);

printf("Tableau original : \n");

printArray(arr, n);

TriGnome(arr, n);

printf("Tableau trié avec TriGnome : \n");

printArray(arr, n);

return 0;

3. Tri par distribution


#include <stdio.h>

// Fonction pour extraire le chiffre à la position i

int cle(int x, int i) {

while (i > 0) {

x /= 10;

i--;

return x % 10;

// Fonction de tri auxiliaire

void TriAux(int T[], int n, int i) {

int counts[10] = {0}; // Tableau pour compter les occurrences de chaque chiffre

int output[n]; // Tableau de sortie

// Compter les occurrences de chaque chiffre

for (int j = 0; j < n; j++) {

counts[cle(T[j], i)]++;

// Calculer les positions finales des éléments

for (int j = 1; j < 10; j++) {

counts[j] += counts[j - 1];

}
// Construire le tableau de sortie

for (int j = n - 1; j >= 0; j--) {

output[counts[cle(T[j], i)] - 1] = T[j];

counts[cle(T[j], i)]--;

// Copier le tableau de sortie dans le tableau d'entrée

for (int j = 0; j < n; j++) {

T[j] = output[j];

// Fonction de tri par base

void TriBase(int T[], int n, int k) {

for (int i = 0; i < k; i++) {

TriAux(T, n, i);

// Fonction pour afficher un tableau

void printArray(int T[], int size) {

for (int i = 0; i < size; i++)

printf("%d ", T[i]);

printf("\n");
}

int main() {

int arr[] = {141, 232, 045, 112, 143};

int n = sizeof(arr) / sizeof(arr[0]);

int k = 3; // Chiffres de 0 à 999

printf("Tableau original : \n");

printArray(arr, n);

TriBase(arr, n, k);

printf("Tableau trié par base : \n");

printArray(arr, n);

return 0;

4. Tri rapide
#include <stdio.h>

// Fonction d'échange de deux éléments dans un tableau

void echanger(int *a, int *b) {

int temp = *a;

*a = *b;
*b = temp;

// Fonction partitionner

int partitionner(int tab[], int p, int r) {

int pivot = tab[p]; // Choix du pivot comme premier élément du tableau

int i = p, j = r;

while (i <= j) {

while (tab[i] <= pivot && i <= r) {

i++;

while (tab[j] > pivot) {

j--;

if (i < j) {

echanger(&tab[i], &tab[j]);

i++;

j--;

echanger(&tab[p], &tab[j]); // Placement du pivot à sa position finale

return j;

}
// Fonction triRapide récursive

void triRapide(int tab[], int p, int r) {

if (p < r) {

int q = partitionner(tab, p, r);

triRapide(tab, p, q);

triRapide(tab, q + 1, r);

// Exemple d'utilisation du tri rapide

int main() {

int tab[] = {7, 2, 1, 6, 8, 5, 3, 4};

int n = sizeof(tab) / sizeof(tab[0]);

printf("Tableau avant le tri rapide :\n");

for (int i = 0; i < n; i++) {

printf("%d ", tab[i]);

printf("\n");

triRapide(tab, 0, n - 1);

printf("Tableau après le tri rapide :\n");

for (int i = 0; i < n; i++) {

printf("%d ", tab[i]);


}

printf("\n");

return 0;

Vous aimerez peut-être aussi