2011-08-20 133 views

回答

6

简单地以线性方式遍历数组。为最小值保留一个变量,为最大值保留一个变量。初始化为数组中的第一个值。然后,对于每个元素,如果该元素分别小于或大于最小值或最大值,则更新最小值或最大值。

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; 

很明显,这段代码假设Count> 0。

请注意,您可以同样使用Math单元中的MinValue和MaxValue例程。

+0

我想我们在同一时间打字!我更喜欢你的初始化,但我更喜欢更紧凑的for..in结构,虽然它取决于他是否支持Delphi的哪个版本。 –

+3

+1对于'MinValue'和'MaxValue'。还有['MinIntValue'](http://docwiki.embarcadero.com/VCL/en/Math.MinIntValue)和['MaxIntValue'](http://docwiki.embarcadero.com/VCL/en/Math)。 MaxIntValue)。 – NGLN

+0

@ngln谢谢你,你当然是对的,我习惯使用浮点数据。 –

4

迭代遍历数组,比较先前找到的最小值和最大值。

这是一段代码片段。澄清之后,我编辑了使用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; 

很有趣的是,在MaxIntValue作为Math.pas实现:

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; 

此实现,类似于大卫的回答,使用第一个数组值作为初始值。这假定数组至少有一个元素。还要注意,循环可以从Low(Data)+ 1开始并保存一个不必要的比较。对于您所描述的数据,每个阵列中有100个元素,最多可以提高1%的速度。

如果性能并不重要,MinIntValue和MaxIntValue会更加简洁。如果你推出自己的游戏,那么你只是遍历数组而不是两次。

+0

谢谢大卫,格式。 –

+0

不是我的数组是int64 .. –

+0

现在代码更改为Int64。 –