diff --git a/COMPTE_RENDU.md b/COMPTE_RENDU.md index 005867a..0fb38cd 100644 --- a/COMPTE_RENDU.md +++ b/COMPTE_RENDU.md @@ -81,4 +81,16 @@ On calcule **M = nombre de décisions + 1**. | F9 `categorie` | 11 `if`/`else if` + 1 `||` + 1 `&&` | 13 + 1 = **14** | | F10 `ajouter_ligne` | 1 `while` | 1 + 1 = **2** | +## 4. Optimiser et vérifier F1 + +Le tri à bulles de `trier_par_montant` effectue O(n²) comparaisons. Il est remplacé par `qsort`, avec un comparateur qui ordonne d'abord les transactions par montant croissant, puis par identifiant croissant en cas d'égalité. Les comparaisons relationnelles évitent le risque de débordement qu'introduirait une soustraction des montants ou des identifiants. Sur la bibliothèque utilisée, le tri a un coût O(n log n), conformément à l'objectif du TD. + +| Mesure | Avant : tri à bulles | Après : `qsort` | +| --- | ---: | ---: | +| Temps réel médian | 2,36 s | 0,97 s | +| Temps utilisateur médian | 2,35 s | 0,97 s | +| Temps système médian | 0,00 s | 0,00 s | +| Empreinte | `ff68d260a7a58441` | `ff68d260a7a58441` | + +Sur ces mesures, le temps réel médian baisse d'environ **59 %** (la version optimisée est environ **2,4 fois plus rapide**). Les valeurs affichées par le programme restent identiques et l'empreinte confirme que le rapport n'a pas changé. diff --git a/banque.c b/banque.c index 02b0e39..378e9a6 100644 --- a/banque.c +++ b/banque.c @@ -71,18 +71,19 @@ Transaction *generer_transactions(int n) /* ------------------------------------------------------------------ */ /* F1 : trie les transactions par montant croissant, puis par id */ +static int comparer_transactions(const void *a, const void *b) +{ + const Transaction *x = a; + const Transaction *y = b; + + if (x->montant != y->montant) + return (x->montant > y->montant) - (x->montant < y->montant); + return (x->id > y->id) - (x->id < y->id); +} + void trier_par_montant(Transaction *t, int n) { - for (int i = 0; i < n - 1; i++) { - for (int j = 0; j < n - 1 - i; j++) { - if (t[j].montant > t[j + 1].montant || - (t[j].montant == t[j + 1].montant && t[j].id > t[j + 1].id)) { - Transaction tmp = t[j]; - t[j] = t[j + 1]; - t[j + 1] = tmp; - } - } - } + qsort(t, (size_t)n, sizeof(*t), comparer_transactions); } /* F2 : nombre de clients ayant au moins une transaction */