整数の配列で反転をカウントするプロジェクトを作成するための学校からの宿題があります。最初は総当たりでやってみましたが、さすがに制限時間は過ぎませんでした。したがって、いくつかのグーグル検索と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;
ご協力いただきありがとうございます。宣言の愚かな間違いであることは知っていますが、それを見つけることができないようです。