2016-07-05 15 views
-2

私のinsertionSort関数は小さな配列では機能しますが、50,000個のランダムな値を持つ配列では機能しません。私はこれを理解しようと時間を費やしましたが、私は困惑しています。ここでは、コードは次のようになります。大きな配列ではC++の挿入ソートが機能しません

void insertionSort(int array[], int length) { 
    int swapHolder, counter, index; 
    for (counter = 1; counter < length; counter++) { 
     index = counter; 
     while (counter > 0 && array[index - 1] > array[index]) { 
       swapHolder = array[index]; 
       array[index] = array[index - 1]; 
       array[index - 1] = swapHolder; 
       index--; 
     } 
    } 
} 

私の他のソート機能(バブルソート)は、大規模な配列のために正常に動作しますが、私はこの問題にハングアップしています。

+5

「うまくいかない」と答えると、それはどういう意味ですか?あなたは、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。そして、[良い質問をする方法について](http://stackoverflow.com/help/how-to-ask)を読んでください。 –

+0

なぜあなたはそれをインクリメントするのではなく 'index'を減らすのですか?O_o – mangusta

+1

...これは常に真実だから" counter> 0 "をチェックするのはなぜですか?保証される。 'counter 'は常に少なくとも1であり、減算されません。この質問への答えは、「あなたの挿入ソートの実装は間違っています。 –

答えて

2

ライン

while (counter > 0 && array[index - 1] > array[index]) { 

が深くノートで

while (index > 0 && array[index - 1] > array[index]) { 

である必要があり、それは小さな配列に最適なように、挿入ソートの平均複雑さはO(n^2)です。つまり、50,000の値をソートするのは正しいアルゴリズムではありません。

+0

どちらもBubbleSortです。私は彼が単にそれを正しくしようとしていると思います、そして、両方とも、大規模な配列であっても、(ゆっくりですが)正しく動作するはずです。 –

+0

ありがとう、それは私の問題を解決しました。私のプログラムは、50,000の値をソートするのに1828ミリ秒かかりました。 –

+0

@RudyVelthuisこれは、さまざまな並べ替え/検索方法の速度を表示するクラスプロジェクトです。 –

関連する問題