セミコロンがないため、check_sorted
への各呼び出しの結果が表示されていますが、これは混乱するものです。あなたはセミコロンを追加する場合は、配列[2 4 1 3]
とsorting
からの出力はコメントで提案している:
>> sorting([2 4 1 3])
ans =
2 1 3 4
は明らかにこれはソートされません。問題は、MATLABが関数の引数を参照ではなく値で渡すことです。再ソートされた行列をcheck_sorted
から戻したり、戻り行列をsorting
で更新しているわけではないので、元の行列は決して更新されません。合格それは最初(またはそれ以降)でソートされていない場合、今行列が更新されます
function [matrix] = check_sorted(matrix)
count = 0;
for index = 1:length(matrix)-1
if matrix(index) < matrix(index + 1)
count = count + 1;
end
end
if count+1 < length(matrix)
matrix = sorting(matrix); % change: return re-sorted matrix
end
end
function [matrix] = sorting(matrix)
for index = 1:length(matrix)-1
if matrix(index) > matrix(index + 1)
temp = matrix(index + 1);
matrix(index + 1) = matrix(index);
matrix(index) = temp;
end
end
matrix = check_sorted(matrix); % change: return checked matrix
end
と完全にソートされたマトリックス:あなたは(変更された行をコメントしている)各機能に少なくとも一つの行を変更する必要があります
sorting
によって返されます。
これは実際には必要ない奇数の再帰です。ソートされていないためにあなたは、ソートのための真偽のブール値を返すようにcheck_sorted
を変更する場合は、sorting
にfor
ループの周りwhile
ループへの再帰を変更することができます。もちろん
function [TF] = check_sorted2(matrix)
count = 0;
for index = 1:length(matrix)-1
if matrix(index) < matrix(index + 1)
count = count + 1;
end
end
TF = count+1 == length(matrix); % TF = true if matrix is sorted
% TF = false otherwise
end
function [matrix] = sorting2(matrix)
while ~check_sorted2(matrix) % keep going until matrix is sorted
for index = 1:length(matrix)-1
if matrix(index) > matrix(index + 1)
temp = matrix(index + 1);
matrix(index + 1) = matrix(index);
matrix(index) = temp;
end
end
end
end
全体のことを最適化することができますベクトル化されていますが、これは少なくともあなたが行くようになります。
あなたが[2 4 1 3]を送信するとどうなりますか?あなたのソートは、あなたが示した正確な場合にのみ機能します。つまり、入力は逆ソートされた配列です。 – Shiping
ああ申し訳ありません。私はcheck_sortedがあなたのソートプロセスの一部であることに気づいていませんでした。 – Shiping