一种简单的排序算法

时间:2017-01-24 00:34:42

标签: arrays matlab function sorting indexing

这是我在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],但是它开始返回未排序的数组?

2 个答案:

答案 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),你可以立即退出循环(设置一个标志后表明数组尚未排序)。