0

整数の配列で反転をカウントするプロジェクトを作成するための学校からの宿題があります。最初は総当たりでやってみましたが、さすがに制限時間は過ぎませんでした。したがって、いくつかのグーグル検索と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;  

ご協力いただきありがとうございます。宣言の愚かな間違いであることは知っていますが、それを見つけることができないようです。

4

1 に答える 1

0

だから私は何とか私の問題を解決することができました。この問題の原因について先生に尋ねたところ、プログラムの先頭で変数の型を宣言することと、本体で宣言することには実際には違いがあるとのことでした。その後、配列型を作成してプログラムを修正しました。

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

この型を介して、関数内およびその他の場所で使用されている配列を宣言しました。そして、それは実際に機能しました。

私が収集したものから、型を使用せずに配列を宣言すると、反復は実際には通常の 1 からではなく、0 から開始されます。正直なところ、これら 2 つの事実がどのように関連しているかはわかりませんが、問題は解決し、意図したとおりに動作するようになりました。

この反復シフトの原因を誰かが知っている場合は、お知らせください。私は実際、以前よりもさらに混乱しています。

于 2017-12-21T01:32:09.623 に答える