2011-08-20 25 views

risposta

6

Passare semplicemente attraverso l'array in modo lineare. Mantieni una variabile per il valore minimo e uno per i valori massimi. Inizializza sia sul primo valore dell'array. Quindi, per ciascun elemento, aggiorna il valore minimo o massimo se quell'elemento è rispettivamente inferiore o superiore al valore minimo o massimo.

minval := a[0]; 
maxval := a[0]; 
for i := 1 to Count-1 do 
begin 
    if a[i]<minval then 
    minval := a[i] 
    else if a[i]>maxval then 
    maxval := a[i]; 
end; 

Ovviamente questo codice assume Count> 0.

Nota che è possibile utilizzare ugualmente le routine MinValue e MaxValue dall'unità Math.

+0

Penso che stavamo scrivendo allo stesso tempo! Mi piace la tua inizializzazione migliore, ma preferisco la struttura più compatta per ..., anche se dipende da quale versione di Delphi ha avuto se è supportata. –

+3

+1 per 'MinValue' e' MaxValue'. Esiste anche ['MinIntValue'] (http://docwiki.embarcadero.com/VCL/en/Math.MinIntValue) e [' MaxIntValue'] (http://docwiki.embarcadero.com/VCL/en/Math. MaxIntValue). – NGLN

+0

@ngln grazie per questo, hai ragione, naturalmente, lavoro abitualmente con dati in virgola mobile. –

4

Iterare attraverso la matrice confrontando il precedente trovato min e max.

Ecco uno snippet di codice. Seguendo il tuo chiarimento, ho modificato il codice per utilizzare Int64.

Min := High(Int64); 
Max := Low(Int64); 
for ThisNumber in MyArray do 
begin 
    if ThisNumber < Min then 
    begin 
    Min := ThisNumber; 
    end 
    if ThisNumber > Max then 
    begin 
    Max := ThisNumber; 
    end; 
end; 

E 'interessante notare che in MaxIntValue Math.pas è implementato come:

function MaxIntValue(const Data: array of Integer): Integer; 
var 
    I: Integer; 
begin 
    Result := Data[Low(Data)]; 
    for I := Low(Data) + 1 to High(Data) do 
    if Result < Data[I] then 
     Result := Data[I]; 
end; 

Questa implementazione, simile alla risposta di David, utilizza il primo valore di matrice come valore iniziale. Ciò presuppone che l'array abbia almeno un elemento. Si noti inoltre che il ciclo può quindi iniziare a Basso (Dati) + 1 e salvare un confronto non necessario. Per i dati che hai descritto, con 100 elementi in ogni array, otterresti un miglioramento della velocità dell'1%, nel migliore dei casi.

Se le prestazioni non sono importanti, MinIntValue e MaxIntValue saranno più concisi. Se lanci il tuo, allora stai solo iterando attraverso l'array una volta invece di due volte.

+0

Grazie David, per la formattazione. –

+0

no my array is int64 .. –

+0

Codice modificato in Int64 ora. –

Problemi correlati