2011-08-20 15 views

Odpowiedz

6

Po prostu przeprowadź pętlę przez macierz w liniowy sposób. Zachowaj zmienną dla wartości minimalnej i jedną dla wartości maksymalnych. Inicjalizuj obie do pierwszej wartości w tablicy. Następnie dla każdego elementu zaktualizuj wartość minimalną lub maksymalną, jeśli ten element jest mniejszy lub większy niż wartość minimalna lub maksymalna.

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; 

Oczywiście ten kod zakłada liczbę> 0.

Należy pamiętać, że równie dobrze można użyć funkcji MinValue i MaxValue z jednostki Math.

+0

Myślę, że pisaliśmy w tym samym czasie! Bardziej podoba mi się twoja inicjalizacja, ale ja wolę bardziej kompaktową dla ... w strukturze, choć zależy to od tego, którą wersję Delphi miał, czy jest obsługiwana. –

+3

+1 Dla 'MinValue' i' MaxValue'. Istnieje również ['MinIntValue'] (http://docwiki.embarcadero.com/VCL/en/Math.MinIntValue) i [' MaxIntValue'] (http://docwiki.embarcadero.com/VCL/en/Math. MaxIntValue). – NGLN

+0

@ngln dzięki za to, masz rację oczywiście, ja zwykle pracuję z danymi zmiennoprzecinkowymi. –

4

Powtórz po tablicy w porównaniu do poprzednio znalezionych min i maks.

Oto fragment kodu. Po wyjaśnieniu edytowałem kod, aby użyć 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; 

To ciekawe, że MaxIntValue w Math.pas jest zaimplementowany jako:

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; 

Implementacja ta, podobnie jak odpowiedź Dawida, korzysta z pierwszej wartości tablicy jako wartości początkowej. Zakłada się, że tablica ma co najmniej jeden element. Zauważ także, że pętla może następnie zacząć od Niskiego (Dane) + 1 i zapisać jedno niepotrzebne porównanie. W przypadku danych, które opisałeś, ze 100 elementami w każdej macierze, uzyskasz w najlepszym razie 1% poprawy prędkości.

Jeśli wydajność nie ma znaczenia, wartości MinIntValue i MaxIntValue będą bardziej zwięzłe. Jeśli rzucasz własną, to tylko iterujesz po tablicy raz, a nie dwa razy.

+0

Dzięki David, do formatowania. –

+0

brak mojej tablicy int64 .. –

+0

Kod zmieniony na Int64 teraz. –

Powiązane problemy