2017-04-12 9 views
1

「ソートは、」私はランダムに生成されたリストに並べ替えを行うC#WPFアプリケーションを設計して、それがかかった時間をミリ秒単位で出力していた整数選択ソートアルゴリズムが挿入のソートよりも一貫して高速なのはなぜですか?

private void insertion_Click(object sender, EventArgs e) 
{ 
    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    for(int i = 1; i < Sorted.Length; i++) 
    { 
     int j = i; 
     while(j>0 && Sorted[j-1] > Sorted[j]) 
     { 
      swap(Sorted, j - 1, j); 
      j -= 1; 
     } 
    } 
    sw.Stop(); 

    IsSorted = true; 
    UpdateButtons(IsSorted); 
    MessageBox.Show($"Insertion sort took {(sw.ElapsedMilliseconds).ToString()} milliseconds", "Insertion sort"); 
} 


//Selection sort 
private void selection_Click(object sender, EventArgs e) 
{ 
    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    for(int i = 0; i < Sorted.Length-1; i++) 
    { 
     int CurrMinIndex = i; 
     for(int j = i; j < Sorted.Length; j++) 
     { 
      if(Sorted[j] < Sorted[CurrMinIndex]) 
      { 
       CurrMinIndex = j; 
      } 
     } 

     if(CurrMinIndex != i) 
     { 
      swap(Sorted, CurrMinIndex, i); 
     } 
    } 
    sw.Stop(); 

    IsSorted = true; 
    UpdateButtons(IsSorted); 
    MessageBox.Show($"Selection sort took {(sw.ElapsedMilliseconds).ToString()} milliseconds", "Selection Sort"); 
} 

のランダムに生成され、最初は未ソート配列でありますコンプリート。私は、挿入ソートは平均して選択ソートより優れているはずですが、私の結果はそうでなければ教えてくれます。私は一度、挿入ソートのタイミングが選択ソートに近づいたことを一度も見ていない。実際、私の選択ソートアルゴリズムは一貫して2倍速いようです!誰もがここで問題を見ていますか?私は2つのアルゴリズムのかなり一般的な形をしたと思ったが、私は誤って最適化したのだろうか?

編集:ここでは、私は私のリストを移入するために使用していたアルゴリズムは次のとおりです。

Sorted = new int[ListSize]; //initialize/populate unsorted array 
Random Rand = new Random(); 
for (int i = 0; i < ListSize; i++) 
{ 
    Sorted[i] = Rand.Next(-1000, 1000); 
} 
+0

ソートするリストがどのくらいあるの挿入、要素Pのための場所を探している間、あなたは完全なスワップを作るが、Pを思い出すために十分である、(半スワップを?)大きな要素をシフトアップ?また、最初の順序が違いを生み出します(配列を逆にすることは、複雑さのための特殊なケースです。例えば、純粋なクイックソートは非常に悪いです)。 – Richard

+0

完全にランダムです。ユーザーは、2000または22399など、必要なサイズの整数値を入力するように求められ、ランダムなリストが生成され、格納されます。次に、任意のアルゴリズムでソートされます。私は私の投稿を更新して、私がどのようにリストを作成しているかを示しました。 –

+0

@Evk:ソートされた配列では '(n^2 -n)/ 2'の比較をすべて行う必要があるため、選択ソートはそれほど高速ではありません。それはスワップはしませんが、早期終了はありません。 –

答えて

1

あなたの挿入ソートの実装では十分ではありません。その後、P

 int j = i; 
    int P = Sorted[j]; 
    while(j>0 && Sorted[j-1] > P) 
     { 
      Sorted[j] = Sorted [j-1]; 
      j--; 
     }; 
    Sorted[j] = P; 
+0

Hmm。そのコードは私にOutOfBounds例外を与えています –

+0

私の間違いは、 'Sorted [j] = P;' – MBo

+0

であるべきです。Ahh、どうもありがとう。それはトリックを行うように見えた。私はまだ何かについて少し不明です。プログラムの挿入ソートを最適化しなければならなかった場合、選択ソートアルゴリズムが最適化されたことになりますか?私はこれらのアルゴリズムのかなり基本的なバージョンを使用していたと思ったので、なぜそのような時間差があるのか​​分かりません。 –

関連する問題