MATLAB でヒープ ソート関数を作成しましたが、正常に動作しますが、入力の長さが 1000 以上の場合、長い時間がかかる場合があります(たとえば、長さが 1000 の場合は 0.5 秒かかります)。MATLAB がヒープ ソート アルゴリズムで非常に高速に実行されないのか、コードを改善する必要があるだけなのかはわかりません。私のコードを以下に示します。
function b = heapsort(a)
[~,n] = size(a);
b = zeros(1,n);
for i = 1:n
a = build_max_heap(a);
b(n+1-i) = a(1);
temp = a(1);
a(1) = a(n+1-i);
a(n+1-i) = temp;
a(n+1-i) = [];
a = heapify(a,1);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function a = build_max_heap(a)
[~,n] = size(a);
m = floor(n/2);
for i = m:-1:1
a = heapify(a,i);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function a = heapify(a,i)
[~,n] = size(a);
left = 2*i;
right = 2*i + 1;
if left <= n
if a(left) >= a(i)
large = left;
else
large = i;
end
else
return
end
if right <= n
if a(right) >= a(large)
large = right;
end
end
if large ~= i
temp = a(large);
a(large) = a(i);
a(i) = temp;
a = heapify(a,large);
end
end
a(n+1-i) = [];
おそらく、多くの時間を消費するコードであることは承知しています。しかし、(入力ベクトルの任意の数よりも小さい)に変更すると、[]
役に立た-999
ず、さらに時間がかかりました。