Zahlen aus Array sortieren
-
SeppJ schrieb:
Wieso wird eigentlich immer Bubblesort als erstes vorgeschlagen? ... Ein Selection oder Insertion Sort ist doch viel einfacher zu verstehen und schon einmal ein ganzes Ende effizienter.
Weil man als Zehnjähriger am Schul- PET auf nichts Besseres gekommen und heute Informatik- Prof ist?
Und nein, leichter zu verstehen sind andere Sortieralgos nicht wirklich, der ganze Kram hat sich dem werdenden Lehrenden erst erschlossen, wenn er die 64er gelesen hat oder die Eltern Dr. Dobb's abonniert haben. An dem Progress möchte er seine Studies teilhaben lassen.
Ob das allerdings eine krankhafte Zwangshandlung darstellt, naja ...Edit: Ich bin zwar nicht IT- Prof, aber meine erste selbstgeschriebene Highscore- Liste sah irgendwie nach Bubblesort aus.
-
Ersteinmal RIESEN DANK an Don Carsto.
Und unser "Lehrer" ist ein Proffesor und hat uns keine vorgabe gemacht wie wir das ganze ausgeben sollen bzw welches Verfahren wir anwenden sollen.
Ist absolut nicht böse gemeitn aber relative SInnlose Diskusionen könnt ihr bitte per PN klären okay???
Ich werde mich morgen nochmal genau dran setzen und gucken ob ich es hin bekomme.
Würde mich über weitere Tipps sehr freuen.Danke nochmal an Alle für die nette Hilfe!
-
Motors-Freak schrieb:
Ist absolut nicht böse gemeitn aber relative SInnlose Diskusionen könnt ihr bitte per PN klären okay???
Ist es nicht ein wenig frech, uns vorzuschreiben, was wir sagen dürfen? Es könnte doch was zwischen den Zeilen stehen, oder?
-
mngbd schrieb:
Motors-Freak schrieb:
Ist absolut nicht böse gemeitn aber relative SInnlose Diskusionen könnt ihr bitte per PN klären okay???
Ist es nicht ein wenig frech, uns vorzuschreiben, was wir sagen dürfen? Es könnte doch was zwischen den Zeilen stehen, oder?
Glaube nicht. Und wenn beantwortet es nun nicht meine Frage. Finde es halt bloß immer etwas unpassend wenn meine eine ganz klar definierte Frage stellt und alles vom Thema abweicht.
Trotzdem ein riesen Dank an alle die geholfen haben udn helfen werden
-
Ich nochmal Leute
Ich bin am Basteln und am Basteln, aber ich kriege es nicht hin. Entweder gibt er mir die zahlen ungeordnet aus oder komische zahlen.
Ich weiß nicht, wie ich den von der Schleife angeordneten Array nun ausgeben soll. Alles andere habe ich glaube ich verstanden. Hier mein Quelltext:#include <stdio.h> #include <string.h> #include <math.h> void main() { int zahlen[10]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } for( z=0; z<5; z++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } i++; } printf("%i", zahlen[i]); }
-
Hi,...
Ich formuliere das mal so:
Suche Dir 5 Zufallszahlen in einer festen Reihenfolge aus und schreibe diese auf ein Blatt Papier.
Jetzt darfst Du nur immer 2 davon miteinander ihre plätze tauschen lassen.
Tue dies so oft bis du eine Ordnung, (oder halt halbordnung) in deiner "Folge", feststellst.
Nun Zähle mal wie oft Du Zahlen tauschen musstest und vergleiche dies mit deinem geposteten Algorithmus.
Grüüße
-
Motors-Freak schrieb:
Ich nochmal Leute
Ich bin am Basteln und am Basteln, aber ich kriege es nicht hin. Entweder gibt er mir die zahlen ungeordnet aus oder komische zahlen.
Ich weiß nicht, wie ich den von der Schleife angeordneten Array nun ausgeben soll. Alles andere habe ich glaube ich verstanden. Hier mein Quelltext:#include <stdio.h> #include <string.h> #include <math.h> void main() { int zahlen[10]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } for( z=0; z<5; z++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } i++; } printf("%i", zahlen[i]); }
So, zum Einen, sind da noch ne Menge Fehler drin, die das Ganze natürlich völlig irrsinnig machen.
Damit du mehr Verständnis dafür aufbringst, möchte ich mal ganz langsam einige Dinge anführen, die offensichtlich aus mangelndem Verständnis der C-Sprach-Syntax entstanden sind.int zahlen[10]; int i; int max=0; int w=0; int z;
Das sieht schon ganz sauber aus.
for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); }
Hier hast du eine Schleife korrekt verwendet und liest auch korrekt ein.
Sehr schön.
Bedenke aber, i hat nun den Wert 5.Und nun wird es haarig:
for( z=0; z<5; z++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } i++; }
Du nimmst eine Schleife mit z und setzt i als Index ein...
Am Ende erhöhst du i immer um 1.
Die Schleife würde an für sich ja laufen, aber welchen Wert hat i denn vor der Schleife?
Also solltest du vor dieser Schleife i=0; setzten.
Eleganter wäre es aber generell:for( i=0; i<5; i++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } }
Das i++ ist nicht mehr nötig, weil die Schleife es nun selbst macht.
Und auch nun wieder die Frage: Welchen Wert hat i nach der Schleife?
Wieder 5??
Denn für das folgende:printf("%i", zahlen[i]);
Gibst du ja nur zahlen[5] aus.
Da steht aber kein Wert drinne, weil du nur Index 0 bis 4 belegt hast.
Kein Wunder, daß dann nur Mist ausgegeben wird.Korrekter wäre hier auch wieder eine Schleife zu kompletten Ausgabe deiner Indexfelder:
for (i=0; i<5; i++) printf("%i", zahlen[i]);
So, korrigiere mal deinen Code und schau dir an, was nun sortiert wird.
Dann folgst du dem Vorschlag von zeusosc und wendest deine Algorythmus auf 5 beliebige Zaheln an.
Beispiel:9 5 4 3 8
So mal sehen: zähler = 0. Zahl 0 und 1 vergleichen.
ist 9 größer 5 ? ja also tauschen und zähler erhöhen.
5 9 4 3 8
Zahl 1 mit Zahl 2 vergleichen.
ist 9 größer 4 ? ja alsotauschen und zähler erhöhen.
5 4 9 3 8
usw. usw.
Was passiert, wenn der Zähler am Ende ist?
Viel Spaß erstmal beim Tüfteln..
Gruß,
DC
-
Stimmt. Ja mir fehlen wirklich noch viele Grundladen, deswegen bin ich hier im Forum um alles ein bisschen zu verfestigen.
Setze mich morgen wieder ran und tüftel dran rum. Werde mich dann wieder melden.
Riesen dank nochmal!
-
Ich glaub ich bin blöd für diese Welt... Ich kriege es einfach nicht hin.
Mein einer Ansatz:#include <stdio.h> #include <string.h> #include <math.h> void main() { int zahlen[10]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } do { for( i=0; i<5; i++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } } for (i=0; i<5; i++) printf("%i", zahlen[i]); }while(zahlen[i]>zahlen[i+1] || zahlen[i+1]>zahlen[i+2] || zahlen[i+2]>zahlen[i+3] || zahlen[i+3]>zahlen[i+4]); }
Er sortiert das erste mal den Aray [9 5 4 3 8]
Er läuft also 5 mal durch, somit steht im Array [5 4 3 8 9]
Dann kommt er zur while Bedingung. Er guckt ob eine Bedingung wahr ist. Als ob irgendeine Zahl im Array größer ist als die darauf folgende. Wenn ja geht er wieder in die for Schleife. Anschließend müsste im Array die Zahlenfolge
[4 3 5 8 9]. Dann prüft er wieder usw...
Funktioniert aber nichtMeine andere Variante:
#include <stdio.h> #include <string.h> #include <math.h> void main() { int zahlen[10]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } for( i=0; i<5; i++) { for( i=0; i<5; i++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } } } for (i=0; i<5; i++) printf("%i", zahlen[i]); }
Er sortiert den Array sodass im Array anstatt[ 9 5 4 3 8] hinterher [ 5 4 3 8 9] steht. Er sortiert 5 mal den Array. Anschließend muss der Array eigentlich sortiert sein. Dann gibt er den sortierten Array aus...
Warum funktioniert es nicht? Ich gebe mir doch schon so eine Mühe und es will einfach nicht... das muntert mich nicht grade auf
-
In der ersten Variante: Welchen Wert hat i, wenn du hier:
}while(zahlen[ i]>zahlen[i+1] || zahlen[i+1]>zahlen[i+2] || zahlen[i+2]>zahlen[i+3] || zahlen[i+3]>zahlen[i+4]);
ankommst?
In der zweiten Variante ist das hier problematisch:
for( i=0; i<5; i++) { for( i=0; i<5; i++)
Die äußere Schleife wird dabei nicht fünfmal durchlaufen, weil die innere mit ihrem Index herumspielt.
Übrigens: main muss laut Standard int zurückgeben. Ich weiß nicht, woher du dieses "void main" hast, aber du solltest es dir schnellstens wieder abgewöhnen.
-
Genau, die äußere Schleife benutzt die gleiche Zählvariable wie die Innere.
Das kann nicht gutgehen.Teste das doch mal, indem du für die äußere Schleife eine andere Variable benutzt. Vielleicht b.
for( b=0; b<5; b++) { for( i=0; i<5; i++)
Lass mal alles Andere wie es ist, ändere nur die äußere Schleife.
(Natürlich vorher int b; zur Deklaration von b.)
Und dann schau dir an, was er dann ausgibt. Vielleicht bist du der Lösung dann schon eine Schritt näher.Gruß,
DC
-
In der zweiten Variante ist das hier problematisch:
for( i=0; i<5; i++) { for( i=0; i<5; i++)
Die äußere Schleife wird dabei nicht fünfmal durchlaufen, weil die innere mit ihrem Index herumspielt.
Wenn ich aber die äusere auf den Wert z lege funktioniert es auch nicht...
Dann ist das Ergebnis erstmal - und dann kommen x-Zahlen die unsinnig sind und dann die letzten 4 stück sind meine zahlen die sortiert sind, aber die 5te Zahl fehlt...
-
Bis du dir sicher, daß dein Code so aussieht?
#include <stdio.h> #include <string.h> #include <math.h> int main() { int zahlen[10]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } for( z=0; z<5; z++) { for( i=0; i<5; i++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } } } for (i=0; i<5; i++) printf("%i", zahlen[i]); }
Wenn nicht, dann schreibe ihn so, denn das ist DEIN Code, nur mit der äußeren Schleife mit z.
Gruß,
DC
-
Hat noch wer einen Tipp?
-
Ja, gib deinen Code so ein, wie ich es in meinem vorherigen Post bereits sagte und schau was er macht.
#include <stdio.h> #include <string.h> #include <math.h> int main() { int zahlen[10]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } for( z=0; z<5; z++) { for( i=0; i<5; i++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } } } for (i=0; i<5; i++) printf("%i", zahlen[i]); }
^^ Diesen dort.. Exakt diesen Code. Nur mit der äußeren Schleife unter Verwendung von z.
Um es nochmals zu wiederhloen:for( z=0; z<5; z++)
Das ist die äußere Schleife, und die ist nun mit z.
Gruß,
DC
-
Ja das habe ich getan. Es funktioniert nicht. Ich habe genau deinen Code eingefügt. Unten ein Link, wo ich einen Screenshot hochgeladen habe...
Ich wieß leider auch nicht wo der Fehler ist
-
int zahlen[10]; // wenn man 5 Werte eingibt, wenn das Array 10 beinhalten kann ... for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } // ... was kann dann bei Wert i+1 im letzten Durchlauf wohl drin stehen: if(zahlen[i]>zahlen[i+1]) {
//Edit deine Ausgabe mal mit Zeilenumbrüchen getrennt
-858993460
3
4
5
6> 9 fällt weg, weil du nur 5 Werte ausgibst und 9 der Größte ist
-
BasicMan01 schrieb:
int zahlen[10]; // wenn man 5 Werte eingibt, wenn das Array 10 beinhalten kann ... for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } // ... was kann dann bei Wert i+1 im letzten Durchlauf wohl drin stehen: if(zahlen[i]>zahlen[i+1]) {
Okay das Erste macht sinn, war mein Fehler. Es hätte heißen müssen zahlen[5]. Aber das letzte kann ich dir nicht sagen. "was kann dann bei Wert i+1 im letzten Durchlauf drinnen stehen" Wieso die Frage? Im letzten Durchlauf müsste die letzte Zahl des Arrays am Ende stehen oder worauf möchtest du hinaus?
Riesen dank nochmal an alle die fleißig helfen!
Hier mein aktueller Code:#include <stdio.h> #include <string.h> #include <math.h> int main() { int zahlen[5]; int i; int max=0; int w=0; int z; for(i=0; i<5; i++) { scanf("%i",&zahlen[i]); } for( z=0; z<5; z++) { for( i=0; i<5; i++) { if(zahlen[i]>zahlen[i+1]) { w=zahlen[i]; zahlen[i]=zahlen[i+1]; zahlen[i+1]=w; } } } for (i=0; i<5; i++) printf("%i", zahlen[i]); }
EDIT:
Korrekt. Wenn ich bei der Ausgabe 6 zahlen ausgeben lasse kommt die 9 mit raus, aber wieso komtm sie nur wenn ich 6 zahlen ausgeben lasse bwohl nur 5 im array sind und woher kommt die Sehr kleine Zahl davor?
-
Dein Array nach der Eingabe
0 > 9
1 > 5
2 > 4
3 > 3
4 > 8
5 > irgendwelcher Speicher mit irgendwelchen Werten oder sonst wasi < 5 bedeutet, i wird maximal Wert 4 erreichen (in deinem Array der letzte Wert)
i+1 wäre 5 und der zeigt nach Lampukistan
-
i läuft in der inneren Schleife zu weit. Wenn du zahlen[i] und zahlen[i + 1] bearbeitest, kommt dabei Blödsinn raus, sobald zahlen[i] der letzte verfügbare Wert ist.