Я пытаюсь реализовать счетчик инверсии в MATLAB с помощью MergeSort, но по некоторым причинам некоторые из ответов удалены. Например, количество инверсий в [3, 4, 8, 1] равно 3, но я получаю 2. Однако массив сортируется правильно, поэтому я думаю, что способ, которым я рассчитываю разделенные инверсии это проблема.Подсчет инверсий в MATLAB с использованием MergeSort
Вот мой код:
function [count, sorted] = mergesort(A)
% count is the number of inversions; sorted is the sorted array.
n = length(A);
if n == 1
count = 0;
sorted = A;
else
m = ceil(n/2);
[count1, sorted1] = mergesort(A(1:m));
[count2, sorted2] = mergesort(A(m+1:n));
[crosscount, sorted] = merge(sorted1, sorted2);
count = count1 + count2 + crosscount;
end
end
function [crosscount, z] = merge(x, y)
n = length(x); m = length(y); z = zeros(1, n+m);
ix = 1;
iy = 1;
crosscount = 0;
for iz = 1:(n+m);
if ix > n
z(iz) = y(iy);
iy = iy + 1;
elseif iy > m
z(iz) = x(ix);
ix = ix + 1;
crosscount = crosscount + (n + 1 - ix); %this might be wrong
elseif x(ix) <= y(iy)
z(iz) = x(ix);
ix = ix + 1;
elseif x(ix) > y(iy)
z(iz) = y(iy);
iy = iy + 1;
crosscount = crosscount + 1; %im pretty sure this is right
end
end
end
Импульсная пара инверсии один, в котором элемент слева больше, чем элемент справа. Например, [5, 4, 3, 1] имеет 6 инверсионных пар: (5, 4), (5, 3), (5, 1), (4, 3), (4, 1) и (3, 1). Аналогичные коды существуют для python, но я не могу перевести это правильно в MATLAB. –