2017-09-22 7 views
-1

コンパイルすると、読み取りアクセス違反のエラーが発生します。他のスタックオーバーフローポストは、これは無限ループのためだと言います。値が非常に大きな負の数になることもわかりました。私はリスト[-1]だからと推測していますが、リスト[0]を超えないように変更する方法はわかりません。C++挿入ソートエラー

挿入ソートコード

void insertion_sort(int list[], int length) { 

for (int i = 1; i < length; i++) { 
    for (int j = i; (j > 0) && (list[j] < list[j - 1]); j--) { 
      swap(list, list[j - 1], list[j]); 
    } 
} 

}

スワップ機能コード

void swap(int list[], int & src, int & dest){ 
    int temp = list[src]; 
    list[src] = list[dest]; 
    list[dest] = temp; 
} 
+1

推測しないでください。デバッガを使用します。スワップするパラメータが何を意味するのかを決めることはできません。あなたがデバッガでコードを踏んだ場合、これは気づいたでしょう。 –

+0

ありがとう、私はデバッガでそれを通過し、私は位置の代わりに値を入力していることに気づいた。 – kltwoa

+0

値の入力だけでなく、値への参照。これにより、リストを渡す必要はありません。単純に 'temp = src; src = dest; dest = temp; 'を呼び出し、残りの部分をコンパイラに処理させます。 – user4581301

答えて

1

あなたはスワップのインデックスとしてあなたの並べ替えの値を使用しています。単純にする。

これは機能します。

void insertion_sort(int list[], int length) { 

    for (int i = 1; i < length; i++) { 
     for (int j = i; (j > 0) && (list[j] < list[j - 1]); j--) { 
      std::swap(list[j - 1], list[j]); 
     } 
    } 
} 

int main() 
{ 

    int arr[ 100 ]; 
    for(size_t i= 0; i < 100; ++i) 
     arr[ i ]= std::rand(); 

    insertion_sort(arr, 100); 

    return 0; 
} 

を追加しました:このよう

は、クラスの練習のように見えます。あなたが気づきたいのは、が存在することを、std::swapは知らないということです。知りたいのは、あなたが交換したい値です。したがって、標準ライブラリを使用できない場合は、スワップを標準のように記述してください。

+0

ありがとう、それはクラスの運動でした。私は間違いを認識しましたが、std :: swapについて学ぶのはうれしいです。私は本当にC++に新しいです – kltwoa

+0

あなたができることは、巨人の肩の上に構築することです。それはすべてほとんど前に行われています。学ぶにつれて、標準ライブラリBoostに依存し、より多くの特殊ライブラリがあります。熟練とは、車輪の再発明を避けることを意味します。 – lakeweb

0
void insertion_sort(int list[], int length) { 

for (int i = 1; i < length; i++) { 
    j = i; 
    while(j > 0 && list[j - 1] > list[j]){ 
     swap(list, list[j], list[j-1]); 
     j--; 
    } 
} 

これは、最小から最大のソートに適しています。 whileループは、スワップが必要かどうかをチェックする作業を行い、再度スワップする必要がある場合は配列内のすでにソートされた位置をチェックします。

ハッピーコーディング。

+0

ありがとう、私はそれを考え出した。私はスワップパラメータを間違って解釈していました。 – kltwoa