BubbleSort
-
Ich soll in einer Aufgabe den BubbleSort so umschreiben dass er nicht die kleinen Zahlen nach links schiebt sondern die großen nach rechts. Was mache ich falsch?
int main(int argc, char** argv) { const int max = 10; int A[max] = {0}; int n = 0, zahl; while (zahl != 0 && n <= max) { cout << "Integer (0 Abbruch): "; cin >> zahl; A[n] = zahl; if (zahl != 0) n++; } for (int i = 0; i <= n; i++) for (int j = n - n; j <= n; j++) { if (A[j] > A[j + 1]) { int tmp = A[j]; A[j] = A[j + 1]; A[j + 1] = tmp; } } for (int i = 0; i < n; i++) cout << A[i] << " "; cout << endl; return 0; }
-
Lapa1503 schrieb:
Ich soll in einer Aufgabe den BubbleSort so umschreiben dass er nicht die kleinen Zahlen nach links schiebt sondern die großen nach rechts.

-
Wie bitte?
-
Lapa1503 schrieb:
Wie bitte?
Naja, die Aufgabe ist offenbar gut dafür geeignet, Leute heraus zu filtern, die nicht mal eine grobe Ahnung davon haben, die der Algo funktioniert.

-
Beim im Skript angegebene Bubble-Sort-Verfahren zum Sortieren ganzer Zahlen
wandern kleine Werte von rechts nach links. Stellen Sie das Verfahren so um, dass
große Werte von links nach rechts bewegt werden. In beiden Varianten erhält man
dadurch eine aufsteigende Sortierung. Implementieren Sie Ihren Algorithmus.
Skript:for (int i=1; i < n; i++) // Durchläufe for (int j=n-1; j>=i; j--) {// ein Durchlauf if (A[j-1] > A[j]) { // vertauschen int tmp = A[j-1]; A[j-1] = A[j]; A[j] = tmp; } } for (int i= 0; i<n ; i++) // Ausgeben cout << A[i] << " ";
-
Sone schrieb:
Lapa1503 schrieb:
Wie bitte?
Naja, die Aufgabe ist offenbar gut dafür geeignet, Leute heraus zu filtern, die nicht mal eine grobe Ahnung davon haben, die der Algo funktioniert.

Der unterschied zur Wahrheit ist, dass ich ihn verstehe. Außerdem hatte ich mir erhofft eine nette Person zu finden die mir eine nette Antwort auf eine normale "Anfänger"-Frage geben kann.
-
Deine beiden for-Schleifen sind schonmal Nonsens. Also die Schleifenköpfe.
-
Sone schrieb:
...
Sone!
Willkommen zurück!
Grüße auch an Hacker!

-
Vielen Dank hustbaer ich schau nochmal rein villeicht komm he ich jetzt drauf.
-
Bitte um Hilfe ich komm echt nicht drauf habe jetzt folgendes
int main(int argc, char** argv) { const int max = 10; int A[max] = {0}; int n = 0, zahl; while (zahl != 0 && n <= max) { cout << "Integer (0 Abbruch): "; cin >> zahl; if (zahl != 0) A[n] = zahl; if (zahl != 0) n++; } for (int i = 1; i < n; i++) for (int j = 0; j <= n; j++) { if (A[j + 1] < A[j]) { int tmp = A[j + 1]; A[j + 1] = A[j]; A[j] = tmp; } } for (int i = 0; i < n; i++) cout << A[i] << " "; cout << endl; return 0; }
-
Kannst du deine Aufgabenstellung nochmal genau erklären ?
Lapa1503 schrieb:
Ich soll in einer Aufgabe den BubbleSort so umschreiben dass er nicht die kleinen Zahlen nach links schiebt sondern die großen nach rechts. Was mache ich falsch?
Wenn die kleinen Zahlen nach links geschoben werden, werden die großen folglich nach rechts geschoben, wo genau ist dein Problem ???
Ich habe deinen Code getestet und er funktioniert doch :
Integer (0 Abbruch): 2 Integer (0 Abbruch): 4 Integer (0 Abbruch): 6 Integer (0 Abbruch): 9 Integer (0 Abbruch): 1 Integer (0 Abbruch): 4 Integer (0 Abbruch): 5 Integer (0 Abbruch): 7 Integer (0 Abbruch): 0 1 0 0 2 4 4 5 6
-
Ich würde aber persönlich ne do-while schleife machen, sonst geht er garnicht erst in deine while rein, weil die bedingung nie erfüllt ist

-
BuhBuh schrieb:
Wenn die kleinen Zahlen nach links geschoben werden, werden die großen folglich nach rechts geschoben, wo genau ist dein Problem ???
Im Orginal 'blubbert' in einem Durchlauf eine kleine Zahl nach links, jetzt soll in einem Durchlauf eine grosse nach rechts 'blubbern'.
int n = 0, zahl; while (zahl != 0 && n <= max) {zahl ist nicht initialisiert. do...while würde sich sowieso anbieten, wenn du auf jeden Fall einmal eine Eingabe brauchst.
for (int i = 1; i < n; i++) for (int j = 0; j <= n; j++) {Deine beiden Schleifen laufen jeweils grob von 1 bis n. Vergleiche das mal mit dem Orginal.
if (A[j + 1] < A[j]) {Was soll A[n+1] sein?
-
naja woher kommen denn die nullen?
-
okay mein code funktioniert wenn die do while schleife durch das überfüllen des arrays abgebrochen wird warum kriege ich bei einem abbruch mit "0" ein falsches ergebnis
Integer (0 Abbruch): 4 Integer (0 Abbruch): 2 Integer (0 Abbruch): 1 Integer (0 Abbruch): 0 0 0 1
-
der aufwand der schleife bleib doch gleich oder? O(n^2)
-
Ja und? Es geht ja sowieso nicht um performance, aber es deutet darauf hin, dass du nicht wirklich weisst, was du bzw. Bubblesort mach(s)t.
-
Ich schaue ob A[0] größer ist als A[1] wenn ja sollen beide vertauscht werden.
Dann geht der zähler hoch und schaut ob A[1] nun größer ist als A[2] wenn ja tausch wenn nein kein tausch. So schwer ist das ja nicht ich glaube nur dass irgendwas mit der Abbruchfunktion nicht stimmt.
-
Ja, es ist einfach. Daher wundert es mich auch, dass du den bereits sortierten Bereich auch weiterhin sortierst. Egal.
Jockelx schrieb:
if (A[j + 1] < A[j]) {Was soll A[n+1] sein?
Selbe Frage für A[n].
-
n=0
und A[n+1] bedeutet A[1]
und A[n] bedeutet A[0]
wenn nun A[1]<A[0]->tausch
n++