2016-04-23 11 views
3

Ich brauche ein Programm, das ein Array von Ganzzahlen sortiert, ohne bedingte Anweisungen zu verwenden. Zahlen liegen im Bereich von 0 bis 100 und wiederholen sich nicht.Array ohne Bedingung sortieren

#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; 
} 

Dieses Programm funktioniert, aber ich bekomme die Fehlermeldung nach Aufforderung des Befehls endet:

Run-Time Check Failure # 2 - Stapeln Sie rund um die Variable 'arr' beschädigt wurde.

Gibt es eine Möglichkeit, es zu beheben?

+0

welchen Compiler verwenden Sie? – Tejendra

+1

"funktioniert" kann ein bisschen stark sein. –

+0

Sie schreiben irgendwo außerhalb der Grenzen. Verwenden Sie einen Debugger und durchlaufen Sie den Code Zeile für Zeile, während Sie die Variablen und ihre Werte im Auge behalten. –

Antwort

3

Das Problem ist, dass Ihr Code über das Ende des Arrays schreibt. Es passiert, nachdem Sie das letzte Element in der gezählten Reihenfolge aufgetreten ist, aber vor dem Array buf erschöpft war, dh

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

Wenn Sie das höchste Element hinzufügen, die 65 ist, zu dem Ergebnis, i 6 erreicht, Das Zuweisen von a[i] wird somit illegal. Sehen Sie, was passiert, indem Sie Ihrem Array ein zusätzliches Element hinzufügen, es auf -1 setzen und beobachten, was damit passiert (es wird auf 100 gesetzt; demo 1).

Sie können das Problem beheben, indem sie ein vorzeitiges Ausscheiden Zustand Zugabe bleibt zu stoppen, sobald Sie das Array gefüllt zurück, dh

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

Nun ist die -1 über das Ende des „aktiven“ Teil unserer Reihe - 1 (demo).

2

Die Logik der zweiten Schleife ist falsch. Sie haben sechs Zahlen in arr, keine Doubles, was bedeutet, dass insgesamt sechs Elemente in buf auf 1 gesetzt werden.

Das bedeutet, dass nach einer gewissen Zeit, der Wert von i6 wird, die man dann als ein Index in arr verwenden, aber Index 6 ist das siebte Element in einem Array, man führt außerhalb der Grenzen zu schreiben.