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.
    Statt

    hilf = 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++);
    

Anmelden zum Antworten