array sortieren



  • Hallo,

    ich möchte ein Array nach der Größe sortieren und habe dazu folgenden Code entwickelt:

    //---------------------------------------------------------------------------
    const int zahl = 5;
    int feld[zahl] = {5,2,3,1,4};
    //---------------------------------------------------------------------------
    void sortieren ()
    {
    for (int i=0;i<zahl;i++)
    {
     int p = 0;
     for (int y=i; y<zahl; y++)
     {
      if (feld[y]<feld[p])
       p = y;
     }
     int h = feld[p];
     feld[p] = feld[i];
     feld[i] = h;
    }
    }
    //---------------------------------------------------------------------------
    

    Da gibt es nur ein Problem, es kommt als Ergebnis

    5
    1
    2
    3
    4
    raus.

    Hat jemand eine Idee voran das liegen könnte?



  • Ich würde an deiner Stelle mal den Debugger nehmen und dort einzeln durchsteppen. (auf den ersten Blick sehe ich jedenfalls keinen Fehler)

    PS: Oder du nutzt gleich die STL:

    #include <algorithm>
    
    ...
    const int zahl = 5;
    int feld[zahl] = {5,2,3,1,4};
    std::sort(feld,feld+zahl);
    


  • die STL darf ich nicht benutzen, ich muss das selbst schreiben.



  • *schaut sich den Code etwas genauer an*

    Dein Fehler ist, daß du p falsch initialisierst - dort sollte wohl eher ein "p=i;" vor der inneren Schleife stehen (feld[0] ist schließlich schon sortiert).



  • Danke, es funktioniert jetzt. Aber ehrlich gesagt, hab ich nicht ganz verstanden warum. Kannst du es mir bitte erklären? 👍 🙂



  • In deinem falschen Programm:
    nach dem ersten Durchlauf steht in feld[0] dein kleinstes Element und feld[1] bis feld[4] sind noch unsortiert - d.h. am Ende deiner innersten Schleife wird p immer noch auf 0 zeigen (weil du kein kleineres Element gefunden hast) und du packst die 1 an Position i (=1).

    Jetzt ersetzen wir "p=0;" durch "p=i;":
    Jetzt wird beim zweiten Durchlauf das Element feld[0] gar nicht mehr überprüft - und die innere Schleife findet korrekterweise das kleinste Element aus dem Restfeld (die 2) - und stellt es an den Anfang des Restfeldes.



  • Du vertauschst die Zahl an Position i mit der Zahl an Position p. p bestimmst du, indem du einen Wert suchst, der kleiner als der an Position i ist.

    Wenn du keinen findest, bleibt p auf 0, du vertauschst aber trotzdem. Das kannst du umgehen, indem du p mit i initialisiert. Dann wird eine Zahl mit sich selbst vertauscht.



  • OK, vielen Dank!

    Ich hab nur noch eine Frage:

    Das Programm soll nach dem Prinzip funktionieren, dass nur die Stelle an "i" getauscht wird, die die kleinste im verbleibenden Feld ist. Das hab ich doch erreicht oder? Bin mir nicht ganz sicher, denke aber, dass es so ist.


Anmelden zum Antworten