Entrambi hanno prestazioni O (N), vale a dire che scalano linearmente con la dimensione dell'array.
Tuttavia, e senza considerare se si tratta di un'ottimizzazione o meno, se la dimensione dell'array è significativa rispetto alle dimensioni della cache del processore, allora il primo avrà meno errori di cache, il che sarà considerevole fattore di prestazioni, poiché l'utilizzo della cache è un grosso problema per i processori moderni.
Quest'ultimo approccio effettuerà una scansione lineare della memoria due volte. Quindi, se l'array è sufficientemente grande, al primo passaggio, l'inizio dell'array verrà inserito nella cache, ma verrà eliminato dalle successive parti dell'array.
Il secondo passaggio dovrà quindi trascinare ancora una volta l'intero array attraverso la cache. Se il lavoro del secondo passaggio può sovrapporsi al lavoro del primo, verrà evitato questo ulteriore tiro attraverso il cache.
Per la migliore separazione delle preoccupazioni, dovremmo fare ognuna separatamente, ma sarebbe simile a questa:
int min = Integer.MAX_VALUE;
for (int x : array) {
if (x < min) min = x;
}
int max = Integer.MIN_VALUE;
for (int x : array) {
if (x > max) max = x;
}
e forse ognuno nel proprio metodo. (La differenza è che non inizializziamo min e max insieme, quindi facciamo min, quindi max.)
Tuttavia, se hai sempre bisogno della coppia insieme, potresti utilizzare il tuo primo approccio e non considererei nemmeno un'ottimizzazione rispetto a quest'ultimo approccio, dato il raggiungimento della coppia minima / massima come requisito.