bubblesort und array



  • Hi Leute!

    Ich hab noch eine Frage:

    Ich soll ein array mit dem bubblesort sortieren.

    Mein code sieht bisher so aus:

    for(i=0; i<a; i=i+1)
    {
     if(array1[i] < array1[i+1])
     {
     sort[i] = array1[i];
     }
     else
     {
    

    Im else-Zweig muss man nun ja die Elemente im array tauschen. Ich weiß aber nicht wie man elemente in einem array tauschen könnte. Wie macht man das?


  • Mod

    Wenn du ein Glas Wasser und ein Glas Bier hast, wie würdest du den Inhalt vertauschen?

    P.S.: Dein anderer Zweig sieht mir nicht richtig aus. Was soll sort sein?



  • In <algorithm> gibts std::swap . Auf der verlinkten Seite gibts auch ne mögliche Implementierung.



  • Bubblesort funktioniert ja so:

    vergeliche 1. mit 2. element. wenn 1. element kleiner, dann speichere 1. elemente in neues array an 1. stelle. wenn 1. element nicht kleiner ist als 2. element im ausgangsarray, dann vertausche beide im ausgangsarray. und alles von vorne... das muss doch mit schleifen funktionieren, oder?


  • Mod

    Du hast das mit dem Bubblesort nicht richtig verstanden. Schnapp dir mal ein paar Spielkarten und versuche diese mit dem Algorithmus den du gerade beschrieben hast, zu sortieren. Du wirst über das Ergebnis enttäuscht sein.



  • du hast recht. ich hab meinen code weitergeschrieben. jetzt hab ich nur noch das problem, dass er nocheinmal durchlaufen müsste, aber mir die for-schleife vorher abbricht...

    Was mach ich jetzt noch falsch?

    for(i=0; i<(a-1); i=i+1)
    {
     if(array1[i] < array1[i+1])
     {
     ;
     }
     else
     {
     a = array1[i];
     b = array1[i+1];
     array1[i] = b;
     array1[i+1] = a;
     }
    }
    

  • Mod

    Hat man dir nicht schon oft genug den Rat gegeben, vernünftige Variablennamen zu benutzen? Das was du da mit dem a machst, ist ganz bestimmt nicht so wie du es eigentlich willst und würdest du gute Namen wählen, würdest du das auch sehen.

    Und deine if-Abfrage ist einfach zum schießen komisch. Schon einmal was von > gehört?



  • Ok, du hast recht. Jetzt sieht's so aus:

    for(i=0; i<(a-1); i=i+1)
    {
     if(array1[i] > array1[i+1])
     {
      a = array1[i];
      b = array1[i+1];
      array1[i] = merkvariable1;
      array1[i+1] = merkvariable2;
     }
    }
    

    Mein Problem hat's aber trotzdem nicht gelöst. Den Bubblesort hab ich verstanden ich bin bloß zu dumm den in Code umzusetzen.


  • Mod

    Das if ist nun schon sehr viel besser, aber auf die Sache mit dem a bist du gar nicht eingegangen. Daher besteht der Fehler natürlich nach wie vor.



  • Den dummen Variablennamen hab ich im nachhinein gefixt. Oben editiert... Da hat sich was überschnitten...



  • bandchef schrieb:

    Den dummen Variablennamen hab ich im nachhinein gefixt. Oben editiert... Da hat sich was überschnitten...

    Nein hast du nicht. Da der Wink mit dem Zaunpfahl noch nicht geholfen hat:

    bandchef schrieb:

    for(i=0; i<(a-1); i=i+1)         // ei schau an - hier steht ein a
    {
     if(array1[i] > array1[i+1])
     {
      a = array1[i];                 // ei schau an - hier änder ich a
      b = array1[i+1];
      array1[i] = merkvariable1;
      array1[i+1] = merkvariable2;
     }
    }
    

    Übrigens kannst du nicht einfach Variablennamen wild änder und denken, dass sich das Problem damit beheben wird. Was soll merkvariable1 und merkvariable2 sein? So einfach läuft das nicht 😃



  • Nochmal von vorne:

    Mein Code:

    for(i=0; i<(a-1); i=i+1) //<- das a hier kommt von einem cin...
    {
     if(array1[i] > array1[i+1])
     {
      merkvariable2 = array1[i];
      merkvariable1 = array1[i+1];
      array1[i] = merkvariable1;
      array1[i+1] = merkvariable2;
     }
    }
    


  • Wenn ich diesen Code nun für ein Array mit den Werten 3,6,2,7,9 durchlaufen lasse, dann sortiert er mir wie folgt: 3,2,6,7,9. Die 3 steht noch an falschen Stelle. Wie bekomme ich das noch hin? Er müsste ja quasi nochmal durchlaufen? Nur wie sag ich ihm das?

    Code:

    for(i=0; i<(a-1); i=i+1)
    {
     if(array1[i] > array1[i+1])
     {
      merkvariable2 = array1[i];
      merkvariable1 = array1[i+1];
      array1[i] = merkvariable1;
      array1[i+1] = merkvariable2;
     }
    }
    


  • #include <iostream> // Für std::cout
    #include <ctime> // Für time()
    
    const int MAX = 20; // 20 Elemente im Array
    
    int main()
    {
        int arr[MAX]; // Array mit MAX Elementen
    
        srand(time(NULL)); // Zufallsgenerator initialisieren
    
        for (int i = 0; i < MAX; ++i) 
        {
            arr[i] = rand(); // Zufallszahl für jedes Element
        }
    
        // Bubblesort
        bool done;
    
        do
        {
            done = true; // Der Standardwert ist true. Wenn also kein Element vertauscht wurde, dann sind wir fertig.
    
            for (int i = 0; i < MAX - 1; ++i)
            {
                if (arr[i] > arr[i + 1]) // Vorheriges Element ist größer? Dann tauschen!
                {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
    
                    // Wir haben getauscht, also starten wir den Prozess erneut, 
                    // um sicherzustellen, dass alle Elemente berücksichtigt werden.
                    done = false;
                }
            }
        } while (!done);
    
        // Ausgabe
        for (int i = 0; i < MAX; ++i)
        {
            std::cout << arr[i] << std::endl;
        }
    
        return 0;
    }
    

    Hier mal ein vollständiges Beispiel.



  • Danke für dein vollständige Beispiel.

    Ich hab jetzt meinen Code so erweitert:

    for(j=0; j<a; j=j+1){
    	for(i=0; i<(a-1); i=i+1)
    	{
    	 if(array1[i] > array1[i+1])
    	 {
    	  merkvariable2 = array1[i];
    	  merkvariable1 = array1[i+1];
    	  array1[i] = merkvariable1;
    	  array1[i+1] = merkvariable2;
    	 }
    	}
    }
    

    Das weiter ob schon mal gekennzeichnete "a" kommt vom Benutzer und stellt die Anzahl der Elemente dar. Funktioniert mein Code jetzt soweit?



  • Ich glaube, du verwechselst das Forum mit einem Compiler/Debugger.
    Du fragst um Hilfe, ignorierst Ratschläge, stellst wieder und wieder deinen Code hier ein und fragst, ob er so funktioniert? Probier´s aus! Konstruiere Testfälle und vergleiche die Ergebnisse mit den erwarteten Ergebnissen. Wenn sie nicht übereinstimmen musst du dir angucken, warum das nicht der Fall ist und den Fehler beheben. Wenn du daran scheiterst kannst du gerne hier nachfragen, aber ich kann dir versichern, dass, wenn du noch ein paar "verbesserte" Quelltexte postest, sich keiner mehr drum kümmern wird.
    Also, etwas mehr Eigeninitiative bitte!



  • Du hast Bubblesort nur zur Hälfte verstanden, du must deine Such/Tausch-Schleife solange wiederholen, wie es was zu tauschen gab:

    int getauscht;
    do { getauscht=0;
        for(i=0; i<(a-1); i=i+1)
        {
         if(array1[i] > array1[i+1])
         {
          merkvariable2 = array1[i];
          merkvariable1 = array1[i+1];
          array1[i] = merkvariable1;
          array1[i+1] = merkvariable2;
          getauscht=1;
         }
        }
    } while( getauscht );
    

Log in to reply