forked from menault/2026_TD3_DEV51_Qualite_Algo
opti trier_par_montant
This commit is contained in:
@@ -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é.
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user