Pascal - 针对反转计数错误输出的增强合并排序

时间:2017-12-20 18:19:08

标签: arrays pascal mergesort inversion

我从学校做了一个家庭作业来创建一个可以计算整数数组反转的项目。我首先尝试暴力破解它,但正如我所料,我没有超过时间限制。所以经过一些谷歌搜索并试图完全理解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;  

提前感谢您的帮助。我知道这只是一个声明中的一些愚蠢的错误,但我似乎无法找到它。

1 个答案:

答案 0 :(得分:0)

所以我有点设法解决了我的问题。我问我的老师可能导致这个问题的原因,他告诉我,在程序开头声明一种变量与在体内声明它之间实际上存在差异。之后我通过创建数组类型修复了我的程序:

type
  numlist = array[1..250000] of longint;

并通过此类型在函数和其他任何地方声明我使用过的数组。它确实奏效了。

根据我的收集,如果你声明一个不使用该类型的数组,迭代实际上从0开始,而不是像往常一样从1开始。我真的不知道这两个事实是如何相关的,但它解决了我的问题,现在它按预期运行。

如果有人知道这次迭代的原因,请告诉我。实际上我比以前更加困惑。