Bubblesort mit Funktion (C++)



  • Hallo EJason,

    ich habe das Gefühl, dass Du selber nicht so genau weißt, was Du mit der Funktion bubblesort erreichen willst. Deshalb kommen hier erstmal ein paar Fragen, die Du Dir selber beantworten solltest:
    Deine Funktionsdeklaration ist:

    int bubblesort(int c[]);
    

    Warum soll die Funktion einen int zurückgeben? Welche Zahl erwartest Du als Rückgabwert?
    Dein einziger Funktionsparameter c ist ein Array([]) von Zahlen (int). In diesem speziellem Fall ist das das Gleiche, wie ein Zeiger auf die erste Zahl. Was willst Du hier an die Funktion übergeben?

    Deine Funktion macht was? Versuch das vielleicht erst mit Deinen eigenen Worten zu formulieren, bevor Du den Code schreibst.

    for(j2=0; j2<9; j2++)
    {
    ...
    }
    

    Das j2 verwendest Du innnerhalb der Schleife nicht mehr. Das heißt, das Innere dieser Schleife wir genau 9 mal wiederholt. Ist es das, was Du hier erreichen wolltest?

    for(j1=0; j1<9; j1++)
    {
    swap(c[j1],c[j1+1]);
    }
    

    Diese Schleife vertauscht jeweils 2 benachberte Zahlen in Deinem Array. Du gehst fest davon aus, dass Du genau 10 Zahlen in Deinem Array hast und vertauschst:

    • die erste mit der zweiten Zahl
    • die zweite mit der dritten Zahl
    • die dritte mit der vierten Zahl
      und so weiter bis
    • die neunte mit der zehnten Zahl
      Ist es das, was Du erreichen willst? Der Ansatz ist schon ok, aber wenn Du wirklich sortieren willst, fehlt da noch ein Vergleich, ob das Vertauschen notwendig ist oder nicht.
      Edit: Den Vergleich machst Du in der swap Funktion, wie ein Nutzer schon sagt. Das hatte ich übersehen.
    return c;
    

    Hier versuchst du jetzt Deinen Funktionsparameter c aus der Funktion zurückzugeben. Das ist ein Array von Zahlen oder auch ein Pointer auf die erste Zahl dieses Array. Wie Deine Fehlermeldung schon sagt, ist das aber keine Zahl(int)! Was willst Du hier erreichen? Wieso meinst Du das Du c aus der Funktion zurückgeben must?



  • @EJason

    Array von Integern der Länge 10

    Aha

    int z[9],

    Hm



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