opti trier_par_montant

This commit is contained in:
2026-10-21 11:17:36 +02:00
parent 2bd16d1b2c
commit 8b28803301
2 changed files with 23 additions and 10 deletions
+12
View File
@@ -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é.
+11 -10
View File
@@ -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 */