Bubblesort mit Funktion (C++)



  • Vielen Dank für eure Antworten. Ich überlege erst nochmal über das, was ihr geschrieben habt und antworte dann darauf 🙂



  • @DJohn

    Die j2-Schleife soll zehn mal durchlaufen werden. In jedem Durchlauf wird die j1-Schleife 10-j2 mal durchgelaufen um die Werte (falls in ungewünschter Reihenfolge) zu vertauschen. Dabei wird der größte Wert des Arrays immer an die letzte Stelle verschoben.

    Das mit dem Pointer habe ich leider nicht so ganz verstanden. Aber immerhin, warum return c ganz zum Schluss das Problem ist. Ich verstehe nicht ganz, wie ich das in diesem Fall aufbauen soll, um am Ende den gesamten, neu sortierten Array in die main-Funktion zu bekommen.

    Habe soweit aber folgende Korrekturen vorgenommen:

    #include <iostream>
    using namespace std;
    
    void swap(int *c1, int *c2);
    
    int bubblesort(int c[]);
    
    int main() {
    	int z[10], i;
    	cout << "Bitte geben Sie 10 ganze Zahlen groesser gleich 0 ein:" << endl;
    	for(i=0; i<10; i++)
    	{
    		cout << "Bitte geben Sie die " << i+1 << ". Zahl ein" << endl;
    		cin >> z[i];
    	}
    	for(i=0; i<10; i++)
    	{
    		cout << z[i] << endl;
    	}
    	bubblesort(z);
    	return 0;
    }
    
    void swap(int *c1, int *c2)
    {
    	int t;
    	t=*c1;
    	*c1=*c2;
    	*c2=t;
    }
    
    int bubblesort(int c[])
    {
    	int j1=0, j2=0;
    	for(j2=0; j2<10; j2++)
    	{
    		for(j1=0; j1<10-j2; j1++)
    		{
    			if(c[j1]<c[j1+1])
    			{
    			swap(c[j1],c[j1+1]);
    			}
    		}
    	}
    	return c;
    }
    
    


  • @EJason sagte in Bubblesort mit Funktion (C++):

    Ich verstehe nicht ganz, wie ich das in diesem Fall aufbauen soll, um am Ende den gesamten, neu sortierten Array in die main-Funktion zu bekommen.

    Dein

    @EJason sagte in Bubblesort mit Funktion (C++):

    int bubblesort(int c[])
    

    ist nur eine andere Schreibweise für

    int bubblesort(int *c)
    

    Das heißt Du übergibst nur einen Zeiger auf den ersten Integer des Arrays. Beim Aufruf Deiner Funktion mit

    @EJason sagte in Bubblesort mit Funktion (C++):

    bubblesort(z);
    

    zerfällt der Bezeichner z in einen Pointer auf das erste Element des Arrays. Siehe Array to Pointer decay.

    c in Deiner Funktion ist also ein Pointer to integer. Der Rückgabetyp Deiner Funktion aber int. Das passt nicht. Du brauchst aber garnichts zurückgeben da Deine Funktion die "Originaldaten" direkt verändert.


    Ich glaube aber nicht daß das was Du da machst ein Bubblesort ist.

    Bubblesort:

    #include <cstddef>
    // ...
    void swap(int &a, int &b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    
    // ...
    int data[] = { whatever };
    std::size_t const length = sizeof data / sizeof *data;
    
    bool sorted;
    do {
        sorted = true;
        for (std::size_t i = 0; i < length - 1; ++i) {
            if (data[i] > data[i + 1]) {
                swap(data[i], data[i + 1]);
                sorted = false;
            }
        }
    } while (!sorted);
    


  • @EJason Wenn j2 0 ist, läuft die verschachtelte Schleife bis einschließlich 9. Wenn du nun auf den Index j1+1 zugreifst, ist das nicht gut. Die Lösung ist aber schon an @Swordfish s Code zu sehen.
    Und ja, das ist ein Bubblesort (nach der kleinen Korrektur):
    https://imgur.com/a/2C4FEb1


  • Gesperrt

    @Swordfish sagte in Bubblesort mit Funktion (C++):

    Ich glaube aber nicht daß das was Du da machst ein Bubblesort ist.

    Doch das ist schon ein BubbleSort... Aber es geht noch einfacher:

    #include <stdio.h>
    
    int bs(int len, int *a)
    {
        int i, j, t, b;
        for (i = 0, b = 1; b; i++)
        {
            b = 0;
            for (j = 0; j < len - 1 - i; j++)
            {
                if (a[j] > a[j + 1])
                {
                    b = 1;
                    t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
        return i;
    }
    
    int main(int argc, char **argv)
    {
        int len = 5;
        int a[] = {1, 2, 3, 4, 5};
        printf("i=%d\n", bs(len, a));
        a[0] = 5;
        a[1] = 4;
        a[2] = 3;
        a[3] = 2;
        a[4] = 1;
        printf("i=%d\n", bs(len, a));
        return 0;
    }
    


  • @EinNutzer0

    Kannst auch noch weiter optimieren... wenn nix getauscht wurde biste fertig.


  • Gesperrt

    @DocShoe sagte in Bubblesort mit Funktion (C++):

    wenn nix getauscht wurde biste fertig.

    ja siehe b



  • Ich habe mir nochmal paar Tutorials auf Youtube dazu angesehen und ich glaube jetzt habe ich es. Musste für den zweiten Teil der Aufgabe noch zusätzlich einen Array der Länge 100 mit Zufallszahlen zwischen 1 und 100 befüllen und ihn ebenfalls sortieren lassen. Dazu musste ich in der Funktion bubblesort noch zusätzlich die Variable int length hinzufügen, damit ich eben mit verschiedenen Längen arbeiten kann. Zusätzlich musste ich am Ende das return c zu einem return c[0] ändern. Und in der main-Funktion musste ich zwei Abläufe vertauschen, damit es richtig abläuft.

    Hier der korrigierte Code:

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    
    void swap(int *c1, int *c2);        //Deklaration der Funktionen swap und bubblesort
    
    int bubblesort(int c[], int length);
    
    int main() {
    	srand(time(0));     //Initialisierung des Zufallszahlengenerators
    	int z[10], i;       //Deklaration der benötigten Arrays und Integer
    	int zufall[100], j;
    
    	cout << "Bitte geben Sie 10 ganze Zahlen groesser gleich 0 ein:" << endl;       //Manuelle Eingabe des Arrays z mit zehn ganzen Zahlen
    	for(i=0; i<10; i++)
    	{
    		cout << "Bitte geben Sie die " << i+1 << ". Zahl ein" << endl;
    		cin >> z[i];
    	}
    	bubblesort(z, 10);      //Aufruf der Funktion bubblesort zum Sortieren des Arrays z und anschließende Ausgabe des sortierten Arrays
    	for(i=0; i<10; i++)
    	{
    		cout << z[i] << endl;
    	}
    	for(j=0; j<100; j++)        //Befüllen des Arrays zufall mit 100 Zufallszahlen
    	{
    		zufall[j]=rand()%100;
    	}
    	bubblesort(zufall, 100);        //Aufruf der Funktion bubblesort zum Sortieren des Arrays z und anschließende Ausgabe des sortierten Arrays
    	for(j=0; j<100; j++)
    	{
    		cout << zufall[j] << endl;
    	}
    
    	return 0;
    }
    
    void swap(int *c1, int *c2)     //Definition der in bubblesort verwendeten swap-Funktion zum Tauschen zweier Werte
    {
    	int t;
    	t=*c1;
    	*c1=*c2;
    	*c2=t;
    }
    
    int bubblesort(int c[], int length)     //Definition der Funktion bubblesort
    {
    	int j1, j2;     //Deklaration zweier Durchlaufindizees
    	for(j2=0; j2<length; j2++)      //Sortierung des Arrays der Laenge lenght innerhalb einer doppelten for-Schleife
    	{
    		for(j1=0; j1<length-j2; j1++)       //Verschiebung der größten Werte  im Array nach hinten, indem bei ungewünschter Reihenfolge swap zum Tauschen aufgerufen wird
    		{
    			if(c[j1]>c[j1+1])
    			{
    			swap(c[j1],c[j1+1]);
    			}
    		}
    	}
    	return c[0];        //Rückgabe des Arrayeintrags (in Form eines Pointers, da Array)
    }
    
    


  • @EinNutzer0 sagte in Bubblesort mit Funktion (C++):

    @DocShoe sagte in Bubblesort mit Funktion (C++):

    wenn nix getauscht wurde biste fertig.

    ja siehe b

    Ups 😉



  • @EJason sagte in Bubblesort mit Funktion (C++):

    das return c zu einem return c[0] ändern

    Warum gibt die Funktion das erste Arrayelement zurück?



  • @manni66 sagte in Bubblesort mit Funktion (C++):

    Warum gibt die Funktion das erste Arrayelement zurück?

    Weil er nicht weiß was er tut. "Tutorials" auf YouTube und trial & error. Wird schon passen.



  • @EJason sagte in Bubblesort mit Funktion (C++):

    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    

    lol



  • @Swordfish
    Ja, ich muss ehrlicherweise zugeben, dass ich das mit den Pointern noch nicht so gut verstanden habe. Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial, die dieses Thema gut erklären? Ich will mich dieses Wochenende intensiver mit meinen Wissenslücken befassen. Die obige Aufgabe musste ich nämlich noch heute abgeben und deswegen war ich etwas in Eile und Panik 😅



  • @EJason sagte in Bubblesort mit Funktion (C++):

    Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial

    "C++ Primer" oder "Der C++ Programmierer" ... das sind so ausgedruckte und gebundene Webseiten (Tutorials).



  • @Swordfish sagte in Bubblesort mit Funktion (C++):

    @EJason sagte in Bubblesort mit Funktion (C++):

    Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial

    "C++ Primer" oder "Der C++ Programmierer" ... das sind so ausgedruckte und gebundene Webseiten (Tutorials).

    Made my day 😄



  • @Swordfish sagte in Bubblesort mit Funktion (C++):

    @EJason sagte in Bubblesort mit Funktion (C++):

    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    

    lol

    Naja, das ganze Zitat wäre

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    

    gewesen.



  • @DocShoe Das lol bezog sich auf die C Header in Kombination mit namespace std.

    @DocShoe sagte in Bubblesort mit Funktion (C++):

    [...] das ganze Zitat [...]

    ich kann nichts dafür daß man keine Base für die Zeilennummern angeben kann.



  • @Swordfish
    Ja, eben, für #include <stdlib.h> und #include <time.h> ist das using namespace std; unsinnig und sorgt für Compilerfehler, weil der namespace unbekannt ist. Mit #include <iostream> wird das sinnvoll.
    Bin heute vllt etwas kleinkariert.



  • @DocShoe sagte in Bubblesort mit Funktion (C++):

    @Swordfish
    Ja, eben, für #include <stdlib.h> und #include <time.h> ist das using namespace std; unsinnig und sorgt für Compilerfehler, weil der namespace unbekannt ist. Mit #include <iostream> wird das sinnvoll.
    Bin heute vllt etwas kleinkariert.

    Ich glaube, der Punkt ist doch eher, dass die beiden Header auf C (nicht C++) hindeuten und using namespace std auch eher ein Antipattern ist (zumindest wenn global eingesetzt). Lediglich am #include <iostream> gibt es nichts zu kritisieren.

    @EJason Das ist aber im Wesentlichen wieder das altbekannte Problem, dass du vermutlich gerade eine Mischung aus C und C++ lernst. Viele "C++-Tutorials" sind eigentlich (schlechte) C-Tutorials, die dann noch zusätzlich "iostream" und somit cin/cout verwenden. In C++ würdest du zum Beispiel auch std::swap verwenden können - das, wenn du dir die Doku anguckst, jeweils Referenzen statt Pointer nimmt. Es ist also sehr fraglich, was du hier lernst. Auf jeden Fall kein idiomatisches C++.



  • @EJason sagte in Bubblesort mit Funktion (C++):

    @Swordfish
    Ja, ich muss ehrlicherweise zugeben, dass ich das mit den Pointern noch nicht so gut verstanden habe. Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial, die dieses Thema gut erklären?

    @Swordfish sagte in Bubblesort mit Funktion (C++):

    "C++ Primer" oder "Der C++ Programmierer" ... das sind so ausgedruckte und gebundene Webseiten (Tutorials).

    Die Reihe hier fand ich gar nicht so schlecht:
    [C++ von { bis }] 6 - Zeiger
    (nur mal eine Folge als passendes Beispiel)