diff --git a/TD4.md b/TD4.md
new file mode 100644
index 0000000..acb2cc2
--- /dev/null
+++ b/TD4.md
@@ -0,0 +1,43 @@
+# TD4 - DEV5.1 : Qualité algorithmique
+
+## Objectifs
+Ce TD vise à travailler sur la **complexité algorithmique** et à améliorer la **qualité des algorithmes**.
+
+---
+
+## Exercice 2 — Calculs de complexité de fonctions
+
+### Calculez la complexité des fonctions suivantes :
+
+**function1 : **
+
+- _Meilleur cas_ : `O(n)` → quand chaque élément de tableau1 est trouvé immédiatement dans tableau2 (grâce au break).
+
+- _Pire cas_ : `0(n × m)` → quand aucun élément ne correspond, on parcourt entièrement les deux tableaux.
+
+**function2 : **
+
+- _Meilleur cas_ : `O(1)` → si la boucle s’arrête directement (ex. première condition vraie).
+
+- _Pire cas_ : `O(x)` → si la boucle parcourt tous les éléments jusqu’à la fin.
+
+**function3 : **
+
+- _Meilleur cas_ : `O(1)`
+
+- _Pire cas_ : `O(1)`
+
+---
+
+## Exercice 3 — Algorithme de tri
+
+### Énoncé
+Créer un **algorithme** permettant de trier un **tableau à N dimensions** contenant **M valeurs** puis Calculer la **complexité algorithmique** de **l’algorithme** écrit .
+
+**tri_tableaux.c : **
+
+- _Meilleur cas_ : `O(N × M)` → si chaque sous-tableau est déjà trié et que les sommes sont déjà dans l’ordre croissant, aucun reclassement n’est nécessaire.
+
+- _Pire cas_ : `O(N × M (log M + log N))` → si chaque sous-tableau est totalement désordonné et que les sommes doivent être recalculées à chaque comparaison pendant le tri principal.
+
+
diff --git a/tri_tableau.c b/tri_tableau.c
new file mode 100644
index 0000000..64f787b
--- /dev/null
+++ b/tri_tableau.c
@@ -0,0 +1,52 @@
+#include
+#include
+
+int comparer(const void *a, const void *b) {
+ return (*(int*)a - *(int*)b);
+}
+
+int somme(int *tab, int taille) {
+ int s = 0;
+ for (int i = 0; i < taille; i++) {
+ s += tab[i];
+ }
+ return s;
+}
+
+// Tri principal selon la somme des sous-tableaux
+void trierTableau(int **tab, int n, int m) {
+ for (int i = 0; i < n; i++) {
+ qsort(tab[i], m, sizeof(int), comparer);
+ }
+
+ for (int i = 0; i < n - 1; i++) {
+ for (int j = i + 1; j < n; j++) {
+ if (somme(tab[i], m) > somme(tab[j], m)) {
+ int *temp = tab[i];
+ tab[i] = tab[j];
+ tab[j] = temp;
+ }
+ }
+ }
+}
+
+int main() {
+ int n = 3, m = 3;
+
+ int ligne1[] = {0, 3, 2};
+ int ligne2[] = {9, 4, 5};
+ int ligne3[] = {4, 1, 3};
+
+ int *tableau[] = {ligne1, ligne2, ligne3};
+
+ trierTableau(tableau, n, m);
+
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ printf("%d ", tableau[i][j]);
+ }
+ printf("\n");
+ }
+
+ return 0;
+}