Array sotieren



  • Moin Leute, vielleicht kann mir jemand von euch weiterhelfen.
    Ich möchte in einem Zahlen-Array die Zahlen absteigend sotieren.
    Nur Leider funktioniert mein Programm nicht.
    Weiß vielleicht jemand wo da der fehler drinn steckt?
    Ausschnitt des Programmes:

    //Variablendeklaration
    
    int nummer[5];
    int temp[5];
    int sort[5];
    int i;
    int j;
    
          //Eingabeteil
          for(i=0;i<=4;i++)
             {
             printf("%i.Zahl :",i+1);
             scanf("%i",&nummer[i]);
             }
    
          //Verarbeitungsteil
          for(j=0;j<=4;j++)
             {
             temp[j]=nummer[j];
             }
    
          for(i=0;i<=4;i++)
             {
             for(j=0;j<=4;j++)
                {
                if((nummer[i]>=temp[j]) && (temp!=0))
                  {
                  sort[i]=temp[j];
                  temp[j]=0;
                  }
                }
             }
    

    Logik:
    Alle eingegebene Nummern werden aus dem array "nummer" in das array "temp" kopiert.Nun wird eine Abfrage gemacht. Wenn die Nummer[i] größer als die nummer temp[j] ist wird die nummer von temp[j] in sort[i] kopiert. Als nächstes wird die Nummer in temp[j] gelöscht,damit beim nächsten Durchgang nicht nocheinmal die gleiche zahl verwendet wird.

    Meine Ausgabe sieht wie folgt aus:

    Eingabe:
    1.Zahl :1
    2.Zahl :3
    3.Zahl :2
    4.Zahl :4
    5.Zahl :5

    Sotierte Ausgabe:

    1.Zahl :1
    2.Zahl :2
    3.Zahl :[0]
    4.Zahl :4
    5.Zahl :5

    Wo steckt der Fehler? 😞



  • Dein Fehler ist, daß du einen vernünftigen Sortieralgorithmus benötigst - im Extremfall löschst du im ersten Durchlauf des for(i) bereits alle Werte aus temp raus und stehst beim zweiten Durchgang vor einem leeren Array.

    (btw, die Bedingung "temp!=0" ist Käse)



  • temp**[j]**!=0



  • temp[j]!=0 hab ich auch schon einmal probiert,aber das bringt auch nichts...



  • Warum setzt du am Ende temp[j]=0?
    Da ist diese Zahl doch beim nächsten Schleifendurchlauf die kleinste und erfüllt deine Bedingung.

    Oder hab ich da nen Denkfehler?



  • Eventuell siehst du ja deinen logischen Fehler, wenn du das Programm Schritt für Schritt durchlaufen lässt:

    i  j  nummer     temp       n[i]>=t[j] sort
          1 3 2 4 5  1 3 2 4 5
    0  0  1 3 2 4 5  1 3 2 4 5  true       1
       1             0 3 2 4 5  false
      ...
       4                        false
    1  0  1 3 2 4 5  0 3 2 4 5  false
       1  1 3 2 4 5  0 3 2 4 5  true       1 3
       2  1 3 2 4 5  0 0 2 4 5  true       1 2
       3  1 3 2 4 5  0 0 0 4 5
    ...
    

    Hier siehst du schon den Fehler - du hast bisher drei Werte gestrichen, aber erst zwei Werte in die sortierte Folge eingefügt.

    Mal ein paar Alternativen, die auch funktionieren werden: Sortierung



  • so alles klar habe mein Programm nun so umgeschrieben:

    int nummer[5];
    int temp;
    int sort[5];
    int i;
    int j;
          for(i=0;i<=4;i++)
            {
            for(j=0;j<=4;j++)
              {
              if(sort[j-1]>sort[j])
                {
                temp=sort[j];
                sort[j]=sort[j-1];
                sort[j-1]=temp;
                }
              }
    
            }
    

    Und es funktioniert 100%ig 🙂 vielen Dank


Anmelden zum Antworten