Anfänger versucht zu sortieren.....
-
Hallo
ich möchte eingegebene Zahlen in ein Array eingeben. Das Array auf-- oder absteigend sortieren und in eine ListBox ausgeben. Leider komme ich nicht
weiter. Also was mache ich falsch? Hier mein Code:x[0] = StrToInt (Edit1->Text); x[1] = StrToInt (Edit2->Text); x[2] = StrToInt (Edit5->Text); x[3] = StrToInt (Edit7->Text); x[4] = StrToInt (Edit8->Text); x[5] = StrToInt (Edit9->Text); x[6] = StrToInt (Edit10->Text); x[7] = StrToInt (Edit11->Text); x[8] = StrToInt (Edit12->Text); x[9] = StrToInt (Edit13->Text); x[10] = StrToInt (Edit14->Text); x[11] = StrToInt (Edit15->Text); x[12] = StrToInt (Edit16->Text); x[13] = StrToInt (Edit17->Text); x[14] = StrToInt (Edit18->Text); x[15] = StrToInt (Edit19->Text); x[16] = StrToInt (Edit20->Text); for (i = 0; i < 16; i++) { for (j = i+1; j < 17; j++) { if (x[i] > x[j]) { hilf = x[i]; x[i] = x[j]; x[j] = hilf; } } } if (RadioButton1->Checked==true)// aufsteigend { ListBox1->Clear(); for (i = 0; i < 16; i++) { ListBox1->Items->Add(x[i]);} } if (RadioButton2->Checked==true)//absteigend { ListBox1->Clear(); for (i = 16; i < 1; i--) { ListBox1->Items->Add(x[i]);} } }thx
G-Kar
-
Hallo,
Der Sortieralgorithmus (Z19 - Z33) sollte so auf jeden Fall funktionieren.
Anmerkung: Die Zuweisung der Editfelder ins Array ist nicht 1:1, also z.B. wird x[2] Editfeld 5 zugewiesen. Ob das so stimmt, musst Du wissen.
Kann sein, dass deine Anwendungen zwei Ausgaben möchte, aber ansonsten würde ich die zweite Ausgabe (absteigend) in einer else Anweisung schreiben - aber ob das für Dich sinnvoll ist, kann ich natürlich auch nicht wissen.
Was genau funktioniert denn Deiner Ansicht nach nicht?
Gruß
Markus
-
Ich vermute mal, dass du den guten alten "Bubblesort" implementieren wolltest, oder ?
du musst diese Vertauschoperation
if (x[i] > x[j])
{hilf = x[i];
x[i] = x[j];
x[j] = hilf;
}solange durchführen, bis für das gesamten Array gilt: x[i] < x[j]), erst dann ist es richtig sortiert. Also den Code in die Richtig erweitern:
bool unsortiert;
do {
unsortiert = false;
for .... Schleife über Array
if (x[i] > x[j]) {
x[i] = x[i] + x[j]; // mal ohne Hilfsvariable
x[j] = x[i] - x[j];
x[i] = x[i] - x[j];
unsortiert= true;
}}
while ( unsortiert )
-
Es gibt mehrere Möglichkeiten den Bubblesort-Algo zu implementieren. Beide gezeigten sind richtig (das Vertauschen mit der Hilfsvariablen ist sogar besser!).
Aber es gibt einen Fehler bei der absteigend sortierten Liste - die Bedingung ist falsch, es muß
for (i = 16; i >= 0; i--)heißen.
-
boch mal thx für die schnellen Antworten. Die Sortierung hatte doch kleine Fehler. Ich hab mich auch dafür entschieden mit einem Eingabefeld und einer ListBox zu arbeiten.
Der funktionierende Code:
for (int i = 0; i < zaehler; i++) { for (int j = 0; j < zaehler-1; j++) { if (zahlen[j] > zahlen[j+1]) { hilf = zahlen[j]; zahlen[j] = zahlen[j+1]; zahlen[j+1] = hilf; } } } if (RadioButton1->Checked==true) { ListBox1->Clear(); //aufsteigend for (int a = 0; a < zaehler; a++) { ListBox1->Items->Add(zahlen[a]);} } if (RadioButton2->Checked==true) { ListBox1->Clear(); for (int a = zaehler-1; a > -1; a--) { ListBox1->Items->Add(zahlen[a]);} }mfg
G-Kar
-
Hallo,
Noch ein Hinweis.
Statthilf = zahlen[j]; zahlen[j] = zahlen[j+1]; zahlen[j+1] = hilf;kann man auch
std::swap(zahlen[j], zahlen[j+1]);schreiben.
-
Ich würde auf sowas ganz verzichten.
Warum das Rad neu erfinden ?vector <int> zahlen; zahlen.push_back(StrToInt(Edit1->Text)); zahlen.push_back(StrToInt(Edit2->Text)); //* if(RadioButton1->Checked) sort(zahlen.begin(),zahlen.end(),less<int>()); else sort(zahlen.begin(),zahlen.end(),greater<int>()); vector <int>::iterator it=zahlen.begin(); ListBox1->Clear(); while(it!=zahlen.end()) ListBox1->Items->Add(*it++);