在这个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)???
答案 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;