2011-08-20 18 views

Respuesta

6

Simplemente recorra la matriz de forma lineal. Mantenga una variable para el valor mínimo y una para los valores máximos. Inicializa ambos en el primer valor de la matriz. Luego, para cada elemento, actualice el valor mínimo o máximo si ese elemento es menor o mayor que el valor mínimo o máximo, respectivamente.

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; 

Obviamente este código asume el conteo> 0.

Tenga en cuenta que también podría usar las rutinas MinValue y MaxValue de la unidad Math.

+0

¡Creo que estábamos escribiendo al mismo tiempo! Me gusta más tu inicialización, pero prefiero la estructura más compacta ... aunque depende de la versión de Delphi que tenga si es compatible. –

+3

+1 para 'MinValue' y' MaxValue'. También hay ['MinIntValue'] (http://docwiki.embarcadero.com/VCL/en/Math.MinIntValue) y [' MaxIntValue'] (http://docwiki.embarcadero.com/VCL/en/Math. MaxIntValue). – NGLN

+0

@ngln gracias por eso, tienes razón, por supuesto, habitualmente trabajo con datos de coma flotante. –

4

Itere a través de la matriz en comparación con los mínimos y máximos encontrados anteriormente.

Aquí hay un fragmento de código. Después de su aclaración, he editado el código para usar 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; 

Es interesante observar que en MaxIntValue Math.pas se implementa como:

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; 

Esta aplicación, similar a la respuesta de David, utiliza el primer valor de la matriz como valor inicial. Esto supone que la matriz tiene al menos un elemento. Tenga en cuenta también que el bucle puede comenzar en Bajo (Datos) + 1 y guardar una comparación innecesaria. Para los datos que ha descrito, con 100 elementos en cada matriz, obtendrá una mejora de velocidad del 1%, en el mejor de los casos.

Si el rendimiento no es importante, entonces MinIntValue y MaxIntValue serán más concisos. Si tira el suyo, solo está iterando a través de la matriz una vez en lugar de dos.

+0

Gracias David, por el formateo. –

+0

no my array is int64 .. –

+0

Código cambiado a Int64 ahora. –

Cuestiones relacionadas