Bubblesort mit Funktion (C++)



  • @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)



  • @zeropage
    Ja, der hat mir auch gut gefallen, zumindest die Sachen, die ich gesehen habe.



  • @DocShoe @wob Die beiden zitierten Header gibt es auch in C++. Aber die heißen geringfügig anders und packen ihr Zeugs auch nach std. Das war mein Punkt.


  • Gesperrt

    Hier wär die C++-Variante (ohne das Einlesen, vielleicht ginge es noch einfacher):

    #include <cstdlib>
    #include <iostream>
    
    size_t bs(const size_t len, int *const a)
    {
        size_t i, j;
        bool conti = true;
        for (i = 0; conti; i++)
        {
            conti = false;
            for (j = 0; j < len - 1 - i; j++)
            {
                if (a[j] > a[j + 1])
                {
                    conti = true;
                    std::swap(a[j], a[j + 1]);
                }
            }
        }
        return i;
    }
    
    int main(int argc, char **argv)
    {
        int a[][5] = {{1, 2, 3, 4, 5}, {5, 4, 3, 2, 1}};
        size_t len = sizeof(a[0]) / sizeof(int);
    
        std::cout << bs(len, a[0]) << std::endl;
        for (int i : a[0])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        std::cout << bs(len, a[1]) << std::endl;
        for (int i : a[1])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        return EXIT_SUCCESS;
    }
    

    Edit: Und noch eine generische Variante:

    #include <cstdlib>
    #include <iostream>
    #include <functional>
    
    template <class T>
    size_t bs(const size_t len, T *const a, const std::function<bool(const T &, const T &)> c)
    {
        size_t i, j;
        bool conti = true;
        for (i = 0; conti; i++)
        {
            conti = false;
            for (j = 0; j < len - 1 - i; j++)
            {
                if (c(a[j], a[j + 1]))
                {
                    conti = true;
                    std::swap(a[j], a[j + 1]);
                }
            }
        }
        return i;
    }
    
    int main(int argc, char **argv)
    {
        float a[2][5];
        size_t len = sizeof(a[0]) / sizeof(int);
        auto compare = [](float x, float y) -> bool { return x > y; };
        for (size_t i = 0; i < 2; i++)
        {
            for (size_t j = 0; j < len; j++)
            {
                a[i][j] = rand() % 20;
            }
        }
    
        std::cout << bs<float>(len, a[0], compare) << std::endl;
        for (int i : a[0])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        std::cout << bs<float>(len, a[1], compare) << std::endl;
        for (int i : a[1])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        return EXIT_SUCCESS;
    }