2016-04-23 11 views
3

条件付きのステートメントを使わずに整数の配列をソートするプログラムが必要です。数値は0〜100の範囲にあり、繰り返されません。条件付きのソート配列

#include <iostream> 
using namespace std; 

int main() { 
    int arr[] = { 34, 12, 24, 65, 63, 22 }; 
    int arraySize = (sizeof(arr)/sizeof(*arr)); 
    unsigned char buf[101] = { 0 }; 

    for (int k = 0; k < arraySize; k++) { 
     buf[arr[k]]++; 
    } 

    unsigned char i = 0; 
    for (int k = 0; k <= 100; k++) { 
     arr[i] = k; 
     i += buf[k]; 
    } 

    for (int a : arr) { 
     cout << a << endl; 
    } 
    system("pause"); 
    return 0; 
} 

このプログラムは動作しますが、コマンドプロンプトを閉じた後、私はエラーを取得する:

ランタイムチェックの失敗#2 - 変数の周りスタック「編曲」が壊れました。

修正方法はありますか?

+0

どのコンパイラを使用していますか? – Tejendra

+1

「作品」は少し強いかもしれません。 –

+0

あなたはどこか外に書き出しています。デバッガを使用して、変数とその値に注意しながら、行単位でコードをステップ実行します。 –

答えて

3

問題は、コードが配列の最後を超えて書き込むことです。それはつまり、あなたがカウントシーケンスの最後の要素に遭遇した後に起こるが、配列buf前に排出された

for (int k = 0; k <= 100; k++) { 
    arr[i] = k; 
    i += buf[k]; 
} 

あなたは結果に、65で最高の要素、iが6に達するを追加

a[i]の割り当ては不正になります。配列に余分な要素を追加し、-1に設定して何が起こっているかを見てください(100; demo 1に設定されます)。

あなたはできるだけ早くあなたが戻って配列を満たしたとして停止するように、早期終了条件を追加することによって、それを修正することができ、すなわち

for (int k = 0; i < arraySize && k <= 100; k++) { 
    arr[i] = k; 
    i += buf[k]; 
} 

今-1たちの列の「アクティブ」部分のままの終わりまで - 1(demo)。

2

2番目のループのロジックが間違っています。 arrには6つの数字があり、倍数はありません。つまり、bufの合計6つの要素は1に設定されます。しばらくして、iの値を使用して、その後arrへのインデックスとして使用6、あろうが、インデックス6が範囲外に書き込むことができつながる、アレイ内要素であることを意味する