我应该在这个Delphi代码中改变什么来获得正确的结果?

时间:2016-03-02 05:31:54

标签: delphi debugging

在这个Delphi代码中,应该将minmum值存储到 newA 并从 A 中删除它,重复此操作直到 A 到达 0号

type TDoubleDynArray  = array of Double;

          ..............

            ..........

//获取最低价值:

function MinValue(var minPos : Integer; Data: TDoubleDynArray): Double;
var
  I: Integer;
begin
  ShowMessageUser(IntToStr( Length(data)));
  Result := Data[Low(Data)];
  for I := Low(Data) + 1 to High(Data) do
    if Result > Data[I] then
      minPos := i;

  Result := Data[minPos];
end;

// -------------------------主要功能------------------

function TForm1.Func(X: TDoubleDynArray): Double;
var
A, newA : TDoubleDynArray;
i, minPos : Integer;
begin

   SetLength(A, 55);
   SetLength(newA, 55);
   A := Copy(X,0, 55);


      for i := 0 to 54 do
      begin
        newA[i] := MinValue(MinPos,A);
        Delete(A, MinPos, 1);
      end;

           ..............

            ..........


 end;

当我运行代码时,它停在大小3(长度A = 3)上:

函数MinValue()的结果 // ShowMessageUser(IntToStr(Length(data)));

55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 三十 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 五 4 3 3 3

我应该改变什么以获得正确的结果(长度(A):= 0)???

2 个答案:

答案 0 :(得分:4)

您的代码存在许多问题。最明显的是,MinValue严重受损。当数组中的第一个值最低时,它无法设置minPos。这解释了为什么您的代码失败。

但是,您应该删除所有代码并使用内置排序功能。你的手动选择排序还没有工作(即使在固定时仍然是O(n 2 )。

使用TArray.Sort执行排序。

var
  SortedX: TArray<Double>;
....
SortedX := Copy(X, 0, 55);
TArray.Sort<Double>(SortedX);

这使用Quicksort,其时间复杂度平均为O(n log n)。

即使您的Delphi版本早于TArray.Sort,概念上您也应该使用经过充分验证的排序算法,并将其封装得很干净。不要像这样滚动你自己的ad-hoc排序代码。

作为一个小问题,创建一个新数组然后像在此代码中那样抛弃它是没有意义的:

SetLength(A, 55);
A := Copy(X, 0, 55);

SetLength的调用毫无意义且浪费,因为新创建的数组在被Copy返回的新数组替换时被抛弃。

答案 1 :(得分:2)

问题似乎在MinValue函数中..

从我所看到的你想要获得数组中的最低值。目前,您只获取数组中低于数组中第一个元素的最后一个元素,而不管它是否是整个数组中的最低值。之所以发生这种情况,是因为您继续与设置为数组第一个元素的Result进行比较,并且永远不会更新。

下面的代码返回数组中的最低值。

function MinValue(var minPos : Integer; Data: TDoubleDynArray): Double;
var
  I: Integer;
begin
  minPos := 0;

  for I := 1 to High(Data) do
    if Data[I] < Data[minPos] then
      minPos := I;

  Result := Data[minPos];
end;