Il modo più efficiente? Cercando di evitare ulteriori passaggi, ho ottenuto questo (in pseudo-codice). Ciò eviterà qualsiasi confronto non necessario che otterrete con altre soluzioni più generali (in particolare quelle che non traggono vantaggio dalla natura transitiva delle operazioni di confronto).
Tenete presente che si tratta solo di efficienza, non mirando affatto a un codice bello.
if a<=b:
if b<=c:
# c too big, which of b and d is smaller?
if b<=d:
return (a,b)
else:
return (a,d)
else if b<=d:
# a and c both < b, and b < d
return (a,c)
else:
# b is > a, c and d. Down to just those three.
if a<=c:
if c<=d:
# a < c < d
return (a,c)
else:
# a and d both < c
return (a,d)
else if d<=a:
# Both c and d < a
return (c,d)
else:
# c < a < d
return (a,c)
else:
# b < a
if a<=c:
# c too big, which of a and d is smaller?
if a<=d:
return (a,b)
else:
return (b,d)
else if a<=d:
# b and c both < a, and a < d
return (b,c)
else:
# a is > b, c and d. Down to just those three.
if b<=c:
if c<=d:
# b < c < d
return (b,c)
else:
# b and d both < c
return (b,d)
else if d<=b:
# Both c and d < b
return (c,d)
else:
# c < b < d
return (b,c)
penso che questo ha un caso peggiore di 5 confronti e un caso migliore di 3 (ovviamente non c'è modo di farlo in meno di 3 confronto).
Non sono sicuro di ciò, quindi non lo invierò come risposta, ma un metodo di "forza bruta" per scansionare l'elenco per il valore più basso due volte, eliminando l'elemento selezionato nel primo passaggio sul secondo passaggio, sarebbe garantire non più di 5 confronti ... –
Penso che http://stackoverflow.com/a/12215020/705048 sarà difficile da battere per l'efficienza. Ma se lo usi, assicurati di commentarlo a fondo per il bene dei tuoi colleghi! – Hbcdev