这是我在Matlab中编写的一个简单的排序函数:
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
check_sorted(matrix)
end
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)
sorting(matrix);
end
end
sorting
函数的输入是一维数组,例如[4 3 2 1],它第一次成功返回已排序的数组[1 2 3 4],但是它开始返回未排序的数组?
答案 0 :(得分:1)
你的分号丢失导致每次调用check_sorted
的结果都显示出来,这让人感到困惑。如果您添加分号,则评论中建议的sorting
与数组[2 4 1 3]
的输出为:
>> 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
以返回布尔值,对于排序为true,对于未排序则为false,您可以将该递归更改为while
循环中for
循环的sorting
循环:
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
当然,整个事情都可以进行优化和矢量化,但这至少可以让你前进。
答案 1 :(得分:0)
我测试了你的算法并且它有效。所以别的可能是错的。但是这种算法非常低效。你可以谷歌排序并选择一个适合你的。
如果你真的想坚持使用算法,你可以通过缩短两个循环来改善它。例如,在第一次调用排序之后,对于每次后续的排序调用,你可以将循环周期缩短1,因为第一次调用排序会将最大的数字放到数组的末尾,第二次调用将放在第二位。到最后的第二个,依此类推。这就是所谓的泡沫分类。同样在check_sorted中,您不需要遍历数组的整个长度来检查数组是否已经排序。一看到矩阵(索引)&gt;矩阵(索引+ 1),你可以立即退出循环(设置一个标志后表明数组尚未排序)。