2011-08-20 136 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。 –