Il existe 120 permutations possibles sur 5 éléments. Votre code doit produire le nombre correct pour chacune d'entre elles. Un code infaillible utiliserait donc 120 répétitions d'un contrôle, comme le suivant :
if (a > b && b > c && c > d && d > e) // the order is a>b>c>d>e
cout << d;
else if (a > b && b > c && c > e && e > d) // the order is a>b>c>e>d
cout << e;
...
else if (e > d && d > c && c > a && e > b) // the order is e>d>c>a>b
cout << a;
else // the order is e>d>c>b>a
cout << b;
Ce code est très long, inefficace et délicat. Si vous faites une faute de frappe dans une seule variable, il produira une mauvaise réponse dans certains cas rares. De plus, il ne gère pas la possibilité que certaines entrées soient égales.
Si le nombre d'entrées d'un algorithme de tri est une petite constante connue, vous pouvez utiliser une approche appelée réseaux de triage . Il s'agit d'un problème informatique bien défini, dont les solutions optimales sont bien connues pour un petit nombre d'entrées, et 5 est certainement un petit nombre. Un réseau de tri optimal pour 5 entrées contient 9 comparateurs, et est décrit par exemple dans le document suivant aquí .
Puisque vous n'avez pas besoin de trier les nombres, mais seulement de connaître la deuxième plus petite entrée, vous pouvez réduire encore la taille du réseau, à 7 comparateurs.
Le réseau de tri complet (sans la réduction de 9 à 7) a été traduit en C++ :
if (b < c)
swap(b, c);
if (d < e)
swap(d, e);
if (b < d)
swap(b, d);
if (a < c)
swap(a, c);
if (c < e)
swap(c, e);
if (a < d)
swap(a, d);
if (a < b)
swap(a, b);
if (c < d)
swap(c, d);
if (b < c)
swap(b, c);
// now the order is a ≥ b ≥ c ≥ d ≥ e
cout << d;
Ce code est également obscur - il n'est pas du tout évident de savoir comment et pourquoi il fonctionne - mais au moins il est petit et, dans un sens, optimal. De plus, il est clair qu'il imprime toujours quelque chose (il résout donc le problème initial) et prend en charge le cas des entrées partiellement égales.
Si vous utilisez un tel code dans un projet plus important, vous devez documenter l'endroit où vous l'avez pris et le tester. Heureusement, il existe exactement 120 possibilités différentes (ou 32, si vous utilisez l'option principe zéro-un ), il existe donc un moyen de prouver que ce code n'a pas de bogues.