我有一项家庭作业,可以创建一个可以在整数中计算反转的项目。我首先试图违反它,但是正如我所期望的那样,我没有通过时间限制。因此,经过一些谷歌搜索并试图完全理解Mergesort以及如何实施反转计数之后,我已经编造了此代码,不幸的是,该代码输出错误的计数,同时正确整理该数组:
procedure mergeSort(var arr, pomarr : array of longint; start, stop :
longint; var inv : longint);
var
mid,i,j,k : longint;
begin
mid := (start + stop) div 2;
if (start < mid) then mergeSort(arr,pomarr,start,mid,inv);
if (mid+1 < stop) then mergeSort(arr,pomarr,mid+1,stop,inv);
i := start;
k := start;
while (i<= mid) and (j <= stop) do begin
if (arr[i] < arr[j]) then begin
pomarr[k] := arr[i];
i += 1;
end
else begin
pomarr[k] := arr[j];
inv += mid - i;
j += 1;
end;
k += 1;
end;
while (i <= mid) do begin
pomarr[k] := arr[i];
i += 1;
k += 1;
end;
while (j <= stop) do begin
pomarr[k] := arr[j];
j += 1;
k += 1;
end;
for k := start to stop do begin
arr[k] := pomarr[k];
end;
end;
事先感谢您的所有帮助。我知道这只是声明中的一些愚蠢错误,但我似乎找不到。
,所以我设法解决了我的问题。我问老师可能导致这个问题的原因,他告诉我,在程序的负责人声明一种变量与在体内宣布的变量实际上是有区别的。之后,我通过创建数组类型来修复程序:
type
numlist = array[1..250000] of longint;
并通过这种类型在功能和其他地方声明了我所使用的数组。它实际上有效。
根据我可以收集的内容,如果您在不使用类型的情况下声明数组,则迭代实际上是从0开始,而不是从1开始。老实说,我不知道这两个事实是如何相关的,但是它解决了我的问题,现在它按预期运行。
如果有人知道导致这种迭代转移的原因,请告诉我。实际上,我比以前更困惑。