Bubblesort mit Funktion (C++)
-
@EJason Wenn
j2
0 ist, läuft die verschachtelte Schleife bis einschließlich 9. Wenn du nun auf den Indexj1+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
-
@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; }
-
Kannst auch noch weiter optimieren... wenn nix getauscht wurde biste fertig.
-
-
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 dasusing 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 dasusing 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.
-
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; }