
Zitat von
Hell yeah!
Allerdings zeigt sich eben das mein Bubblesortalgorithmus nicht korrekt funktioniert. -.-
Mehr noch: Du müsstest theoretisch sogar eine Memory Access Violation mit Programmabsturz bekommen, weil beim bisherigen Code auf Indexbereiche zugegriffen wird, die nicht mehr zum Array gehören.
Betrachten wir mal den entsprechenden Code. (Dass es kein richtiger Bubblesort ist, will ich hier mal gar nicht monieren.)
Code:
for (Counter = 0; Counter < Variablenanzahl; Counter++)
{
int Zwischenspeicher;
int Counter2 = Counter;
while (Counter2 < Variablenanzahl)
{
Counter2++;
if (Array[Counter + Counter2] < Array[Counter2])
{
Zwischenspeicher = Array[Counter2];
Array[Counter2] = Array[Counter + Counter2];
Array[Counter + Counter2] = Zwischenspeicher;
}
}
}
Variablenanzahl enthält die Anzahl der Elemente im Array, d.h. der Index im Array läuft von 0 bis Variablenanzahl-1. Mit der Bedingung der for-Schleife wird zwar sichergestellt, dass Counter immer in diesem Bereich ist, aber Counter2 ist es nicht. Dazu kommt, dass du den Index stellenweise als Counter2 plus(!) Counter2 berechnest, also im Extremfall (wenn das Programm nicht vorher abbricht) auf einen Bereich zugegriffen wird, der in etwa doppelt so groß ist wie der eigentliche Array es hergibt. Was in dem Bereich steht, der nicht zum Array gehört, kann man nicht sagen, bestenfalls steht da irgendwelcher zufälliger Müll drin. Schlimmstenfalls schreibst du damit in andere Speicherbereiche, in die du eigentlich gar nichts schreiben willst, mit dem Ergebnis, dass Programme, die (berechtigterweise) auf diesen Bereich zugreifen wollen, irgendwelche für sie völlig unpassenden Daten lesen.
Zu einem der Fehler:
Vor der while-Schleife wird Counter2 auf den Wert von Counter gesetzt. Im letzten Durchlauf ist das der Wert des höchsten, zulässigen Arrayindex, also Variablenanzahl-1. Dann wird aber in der ersten Zeile innerhalb der while-Schleife, gleich Counter2 um eins erhöht, womit der Zugriff auf Array[Counter2] schon auf einen Index geht, der nicht mehr zum Array gehört, sondern "dahinter" liegt. Dass Array[Counter + Counter2] dann erst recht einen solchen erwischt, ist klar, hier ist der Index ja durch die Addition noch höher.
Angenommen, dein Array hat 10 Elemente, d.h. der höchste Index ist 9, dann ist im ersten Durchlauf der Schleife Counter==0, und irgendwann zum letzten Durchlauf der while-Schleife wird Counter2==10 erreichen. In dem Moment, wo die Bedingung der while-Schleife, also (Counter2 < Variablenanzahl), überprüft wird, ist Counter2 noch auf 9, aber er wird gleich danach auf 10 erhöht. Schlecht, damit wird's ein ungültiger Index. In nächsten Durchläufen der for-Schleife werden schon die letzten zwei Durchgänge der while-Schleife auf einen ungültigen Index zugreifen, im nächsten Durchlauf der for-Schleife werden es drei sein, und so geht das weiter.
Um das zu beheben, würde ich dir vorschlagen, erstens die while- durch eine weitere for-Schleife zu ersetzen. (Man kann Schleifen auch verschachteln.) Zweitens solltest du die Sache mit den Indices beheben, indem du die Addition da rausnimmst und einfach nur auf Indices mit Counter und Counter2 zugreifst und die vergleichst.
Das müsste dann in etwa so aussehen:
Code:
int i, j, Zwischenspeicher;
for (i=0; i<Variablenanzahl; ++i)
{
for (j=i+1; j<Variablenanzahl; ++j)
{
if (Array[i]<Array[j])
{
Zwischenspeicher = Array[i];
Array[i] = Array[j];
Array[j] = Zwischenspeicher;
}//if
} //for j
}//for i