2011-08-20 17 views

答えて

6

直線的に配列をループするだけです。最小値の変数と最大値の変数を保持します。両方を配列の最初の値に初期化します。次に、各要素について、その要素が最小値または最大値よりも小さいかまたは大きい場合に、minまたはmax値を更新します。

明らかに、このコードは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; 

それはMath.pasでMaxIntValueとして実装されていることに注意することは興味深いです:

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; 

この実装では、デビッドの答えと同様に、初期値として最初の配列の値を使用しています。これは、配列に少なくとも1つの要素があることを前提としています。また、ループはLow(Data)+ 1で開始し、不要な比較を1つ保存することができます。あなたが記述したデータでは、各配列に100個の要素があり、せいぜい1%の速度向上しか得られません。

性能が重要でない場合は、MinIntValueとMaxIntValueがより簡潔になります。独自のロールを作成する場合は、配列を2回ではなく1回だけ繰り返します。

+0

フォーマットのためにDavidに感謝します。 –

+0

配列がint64ではありません。 –

+0

コードがInt64に変更されました。 –

関連する問題