2016-06-22 2 views
0

私は、データ構造上のコースを取っていて、インストラクターが選択のために、この次のコードを与えたsort.But私が選択ソートでは、我々は配列全体をスキャンするので、それは正しくないと考え、各反復における最小の要素を見つけ、その正しい位置でスワップします。しかし、以下のコードでは毎回スワップしていますが、現在の要素よりも小さい要素が見つかります。これが正しいかどうかを教えてください。以下の選択ソートコードは正しいですか?

public static void selectionsort(int[] listtosort) 
{ 
    for (int i=0; i<listToSort.length; i++) 
    { 
     for (int j=i+1; j<listToSort.length; j++) 
     { 
      if (listToSort[i] > listToSort[j]) 
      { 
       swap(listToSort, i, j); 
       print(listToSort); 
      } 
     } 
    } 
} 
+0

しかし、我々は常に正しい最悪のケースでアルゴリズムのもパフォーマンスを測定する?スワップの数は、最悪の場合にはO(N^2)は、選択ソートは少ない数を持っているという事実を奪うscenario.Alsoされます挿入の並べ替えと比較したときのスワップの割合。 –

+0

私はスワップの数が右最悪の場合はO(N^2)となります、私が言及しているコードに意味ですか?メモリに書き込みが例のフラッシュメモリのために言うように読み込むよりも高価であれば、彼らは「ビッグOのパフォーマンスしかし、スワップの数を変更いけない –

+0

ええ権利が重要な権利になりますか? –

答えて

0

あなたはその面で正しいです。より小さい数に遭遇するたびにスワップする代わりに、より小さい数のインデックスを格納することができ、内側の反復の最後に、現在の番号を最小の番号でスワップすることができます。しかし、このアプローチはこのソートアルゴリズムの複雑さに影響しません。両方ともO(n^2)です。数字が小さい場合、それはO(1)です。数字が小さい場合は、そのインデックスを保持したままO(1)に戻ります。

public static void SelectionSort (int [ ] num) { 
int i, j, first, temp; 
for (i = num.length - 1; i > 0; i - -) { 
    first = 0; //initialize to subscript of first element 
    for(j = 1; j <= i; j ++) { 
    if(num[ j ] < num[ first ])   
     first = j; 
    } 
    temp = num[ first ]; //swap smallest found with element in position i. 
    num[ first ] = num[ i ]; 
    num[ i ] = temp; 
}  
+0

うんしかしスワップは、私が言及したright.Forコードを増加しますは、No.of、は、No.ofスワップは、それが選択ソートの利点の一つを奪う最悪case.SoでO(N^2)となります他のソートアルゴリズムと比較して、スワップの数が少ないことは正しいですか? –

+0

選択の並べ替えは正反対で、最悪の場合は基本的には最良のケースです。さまざまな複雑さを示す[this link](http://bigocheatsheet.com/)をご覧ください。ちょうどGoogleの "複雑さを並べ替える"と便利な情報を即座にポップアップ。 – mojo1mojo2

+0

@SaiSankalpそうです、スワップの回数はほとんどの場合増加します。しかし、それは複雑さの点で唯一一定の乗数です。 (スワッピングコストとインデックスを保存するコスト) –

関連する問題