2017-01-24 13 views
2

これは私は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関数の入力は、例えば、1Dアレイであります[4 3 2 1]、ソートされた配列[1 2 3 4]を最初に呼び出すと正常に返されますが、ソートされていない配列が返されます。

+0

あなたが[2 4 1 3]を送信するとどうなりますか?あなたのソートは、あなたが示した正確な場合にのみ機能します。つまり、入力は逆ソートされた配列です。 – Shiping

+0

ああ申し訳ありません。私はcheck_sortedがあなたのソートプロセスの一部であることに気づいていませんでした。 – Shiping

答えて

0

私はあなたのアルゴリズムをテストし、うまくいきました。他の何かが間違っているかもしれません。このアルゴリズムは非常に非常に非効率的です。あなたはGoogleの並べ替えとあなたに合ったものを選ぶかもしれません。

本当にアルゴリズムを守りたい場合は、2つのループを短縮して改善することができます。たとえば、ソートを最初に呼び出した後、ソートを呼び出すたびにループサイクルを1短くすることができます。ソートを最初に呼び出すと配列の最後に最大の番号が置かれ、2番目の呼び出しが2番目に大きい最後から2番目に、等々。これはバブルソートと呼ばれています。 check_sortedで配列がソートされているかどうかをチェックするために配列の全長を調べる必要はありません。 matrix(index)> matrix(index + 1)が表示されるとすぐに、(配列がソートされていないことを示すフラグを設定した後で)すぐにループを終了することができます。

1

セミコロンがないため、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を変更する場合は、sortingforループの周り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 

全体のことを最適化することができますベクトル化されていますが、これは少なくともあなたが行くようになります。