Dans cette fonction, il y a deux boucles imbriquées : la première parcourt tous les éléments de `tableau1` (de taille \(n\)), et pour chaque élément, la deuxième boucle parcourt `tableau2` (de taille \(m\)).
Dans le pire des cas, si aucun élément ne correspond (ou si le `break` n'est jamais atteint), chaque élément de `tableau1` sera comparé à tous les éléments de `tableau2`.
Donc, la complexité de cette fonction est \( O(n \cdot m) \).
2.**`function_2(x)`** :
Ici, on a une boucle `while` qui s’exécute \(x\) fois. À chaque itération, on effectue une addition et une décrémentation, qui prennent toutes les deux un temps constant.
Du coup, la complexité est proportionnelle à \(x\), donc \( O(x) \).
3.**`function_3(x)`** :
Cette fonction contient uniquement des blocs `if` indépendants, qui s’exécutent chacun au maximum une seule fois. Il n’y a pas de boucle, donc chaque opération est constante.
La complexité est donc \( O(1) \), car c’est constant peu importe la valeur de \(x\).
Pour analyser la complexité de la fonction **`sort_students`**, on décompose chaque étape :
1.**Boucle externe sur les grades** :
La boucle externe parcourt tous les grades des étudiants, soit \( \text{grades\_number} \) itérations.
2.**Allocation dynamique des notes** :
L’allocation du tableau `grades` est faite avec `malloc`, qui est supposée avoir une complexité \( O(1) \). Cela n’affecte donc pas significativement la complexité globale.
3.**Copie des notes des étudiants** :
Dans la boucle interne :
```c
for(j = 0; j <students_number;j++){
grades[j] = students_array[j][i];
}
```
on copie les notes des \( \text{students\_number} \) étudiants, ce qui prend \( O(\text{students\_number}) \) par itération de la boucle externe.
4.**Tri des notes avec `bubblesort`** :
La fonction `bubblesort` trie un tableau de taille \( \text{students\_number} \), avec une complexité \( O(\text{students\_number}^2) \).
on appelle `find_rank_student` pour chaque étudiant. Cette fonction effectue :
- Un tri par bulles \( O(\text{students\_number}^2) \),
- Une recherche pour trouver le rang, qui prend \( O(\text{students\_number}) \).
Donc, chaque appel à `find_rank_student` a une complexité totale de \( O(\text{students\_number}^2) \), et cette fonction est appelée \( \text{students\_number} \) fois par itération de la boucle externe. Cela donne une complexité \( O(\text{students\_number}^3) \) par itération de la boucle externe.
6.**Libération de mémoire** :
Enfin, la mémoire allouée pour `grades` est libérée avec `free`, ce qui est une opération \( O(1) \).
### Complexité totale :
La boucle externe s’exécute \( \text{grades\_number} \) fois, et la partie la plus coûteuse de la boucle interne est \( O(\text{students\_number}^3) \). La complexité globale de la fonction est donc :