Selection Sort
-
also, deine arrays... bei der eingabe: da sieht es für mich im moment so aus, als ob du da quer durch den RAM schreiben würdest, ein wunder, dass da nichts abstürzt!

du reservierst dir einen speicherbereich mit der breite "0" (siehe zeile 11: meckert der compiler da echt GAR NICHTS??? ) und schreibst dann da was weiß ich wie viele zahlen rein. Das kann doch nicht gutgehen...
-
Naja... ich möchte ja mein Array am Anfang füllen mit dne eingaben des Benutzers. Da ich ja nicht weiß wieviele Zahlen er eingibt. Habe ic hjes so gelößt. Funktioniert auch. Hier nochmal meine Dnekweise wie ich dasProgramm ausführen möchte oder was es machen soll.. Beim Sleection Sort soll ja aus einer Folge der kleinste Wert genommen werden und an die erste Stelle gelegt werden. Dann soll der 2t kleinste Wert genommen werden und an die 2 Position gelegt werden.Und so weiter und so weiter. So nun dazu wie ich das realisieren möchte. Ich habe mir gedacht das ich von der eingegebenen folge die erste Zhal festmache und sie mit allen anderen vergleiche. Die die kleiner sind soll er dann ersetzten durch die zahl die ich "festgenagelt" habe. Damit bleibt ja dann immer die kleisnte übirg nach der Suche. Wenn er dann den kleinsten Wert gefunden hat soll er den durch einen westenlichen Größeren Wert ersetzen damit er beim nächsten durchlauf nicht wieder auf den gleichen Wert trifft, sondern den 2t kleinsten. Das macht er dann solange bis er alle Zahlensich angeguckt hat und alle gefunden dann in einem neuen Array ausgibt. Diese sind ja dann automatisch sortiert.....
-
na das ist ja obergeil^^ :p
taikahn schrieb:
Da ich ja nicht weiß wieviele Zahlen er eingibt. Habe ic hjes so gelößt.
indem du blind irgendeinen müll quer durch den ganzen speicher schreibst, sodass sich dieses array wahrscheinlich mit allen anderen variablen "überlappt" ??? na das ist ja mal ein ordentlicher lösungsansatz^^
taikahn schrieb:
Funktioniert auch.
ich garantiere dir, dass es so nicht funktionieren kann. wo wäre denn ansonsten das problem?
also: so wie es aussieht, musst du zB platz für 100 integer-werte von anfang an reservieren, und den benutzer darauf einschränken, sodass er nicht mehr angeben kann, oder du machst es mit einem vector aus der stl, ein vector kannst du bei bedarf auch vergrößern lassen, wenn es nötig ist. Oder du fragst den benutzer, wieviele zahlen der eingeben will, und legst ein entsprechend großes array mit "new" auf dem heap an. gibt viele möglichkeiten.
Aber so wie es da jetzt steht, geht es bestimmt nicht
-
Mh aber ich meien halt wenn ic hmti dannach die einzelnen Arrays anzeigen lasse dann zeigt er mir auch zu dne netsprechenden INdex positionen den eingegeben Wert an. deswegen dachte ic hes funktioniert.Aber ok dann schränke ich es ein! Hast du dir mal meinen Lösungweg zur realisierung des Selection Sort angeguckt? Was mneisnt du dazu? Es ist doch möglich oder?Oder habe ich da doch was falsch verstanden.Wäre lieb wenn du dazu noch was sagen könntest.Vielen Dank!
-
taikahn schrieb:
Mh aber ich meien halt wenn ic hmti dannach die einzelnen Arrays anzeigen lasse dann zeigt er mir auch zu dne netsprechenden INdex positionen den eingegeben Wert an.
hm... ja, kann unter umständen vorkommen, wenn man so etwas macht:
int a[0]; //nichts reserviert! //hier wird die eingabe "simuliert" //ob man es vom benutzer kriegt, oder im programm direkt setzt, ist egal a[0]=123; a[1]=456; a[2]=789; //hier werden keine weiteren zwischenschritte gemacht: //dein array liegt jetzt zwar in einem nicht reservierten speicherbereich //aber weil sich im programm sonst nichts bewegt, wird dieses array trotzdem //nicht durcheinandergebracht. _noch_ nicht. aber dald //hier der "test": ausgabe cout<<a[0]<<a[1]<<[2]<<endl; //ausgabe: 123 456 789 //scheint noch alles in ordnung zu sein heh? //fängst du aber an, mit anderen variablen und arrays herumzuhantieren //so wird dein array a[] einfach mit anderem zeugs überschrieben //dann gibts natürlich kein sortiertes array, sondern einen haufen trümmer z[0]= 987; z[1]=654; z[2]=321; //irgendwas mit dem anderen array machen //jetzt überprüfst du den inhalt erneut: cout<<a[0]<<a[1]<<[2]<<endl; //ausgabe= voila: haufen trümmer
-
houi danke dir! HAst ja recht! Habe in meinem Programm mal mehr als 10 Zahlen eingegeben und dann ister abgestürzt... HAst ja recht
Was meisnt du nun zu meinem Gedankengang oben wie ich dne Selection Sort realisieren möchte?
-
öhm... zu dem verfahren...
erstma ein tipp, ganz allgemein: deine namensgebung der variablen ist nicht besonders günstig, das ist für andere unverständlich, und du wirst es auch nicht nachvollziehen können, wenn du es dir in zwei wochen wieder anschaust.dann scheint mir irgendwie, dass da ein paar variablen zu viel drinne sind, für ein simples sortierverfahren.
was den gesammten algorythmus angeht, werde ich gleich schauen, hab im moment selbst eine frage gestellt, muss zuerst das klären..
-
Jo ist ok! Geht ja nur darum ob die Logik hinhaut!! Danke dir!!!
-
Hey ich nochmal ich habe da einen Fehler in meinen Quelltext entdeckt der sit mir aber nur unlogisch. Schau dir mal die erste Whileschleife an:
//Selection Sort #include <iostream> #include <conio.h> #include<iomanip> using namespace std; int main() { int a1,b=0,i=0,f=0,e=0; int a[100],z[100]; int x[1]={99}; cout<<"Der kleine suesse Selection Sort"<<endl<<endl<<endl; cout<<"Eingabe der unsortierten Folge:"; cout<<endl; while(cin.eof()==0) { cin>>a[e]; e++; b++; }; b=b-1; //-1 durch die eingabe strg z cout<<"das b ="<<b;Also das b in der Schleife wird korrekt mitgezählt aber wenn ich halt das b nach dr Schleife anzeigen lasse dann kommen da die größten zahlen raus.. Wie kann das denn sein?? Da wird auch mein Fehler leigen da ic haj das b weiter verwende...
-
Sehr merkwürdig.. nehme ich die Schleifen darunter dazu spinnt das B total rum.Sind sie weg dann funzt es richtig! Was soll das denn????? Hier nocjhma das beispiel wo das b komisch ist:
//ShellSort #include <iostream> #include <conio.h> #include<iomanip> using namespace std; int main() { int b=0,i,j,c,f,temp,e=0; int a[100],z[100],x[1]={99}; cout<<"Der kleine suesse ShellSort"<<endl<<endl<<endl; cout<<"Eingabe der unsortierten Folge:"; cout<<endl; while(cin.eof()==0) { cin>>a[e]; e++; b++; }; b=b-1; //-1 durch die eingabe strg z cout<<"das b ="<<b; // eigentliche Selectionsort for(e=0;e<b;e++) z[e]=a[0]; for(f=0;f<b;f++) { if(a[f]<z[e] && z[e]!=a[f]) z[e]=a[f]; a[f]=x[0]; } for(e=0;e<b;e++) cout<<z[e]; getch(); }
-
ähm...
also: vorschläge=- du hast jetzt zwar den speicherplatz für 100 zahler reserviert, es ist aber nach wie vor möglich, über die grenzen hinauszuschreiben, und ist meistens sowieso speicherplatzverschwendung= keiner wird da je rumsitzen und 100 zahlen eintippen wollen
=> machs lieber mit new und delete. lohnt sich. dann lernst du auch gleich, wie man's machen sollte, besser, als sich irgendwas schlechtes anzugewöhnen
2)reduzier doch mal die anzahl der variablen.
nimm dir am besten ein paar kleine zettel, schreib da zahlen drauf, und überlege dir, wie du sie am einfachsten sortierst. Da wirst du festellen, dass du da keine sieben variablen brauchst (schon gar nicht zwei arrays!!
)3)nimm zuerst lieber for() statt while(), for() rennt zumindest nicht ins unendliche wenn was schief läuft
- kommentier doch mal ein bisschen, was du da machst, ich blick echt nicht durch...
also, ich hab jetzt versucht, deine beschreibung in code umzusetzen, da ist folgendes rausgekommen:
#include <iostream> int main(){ using namespace std; int iArrayLength; //länge des arrays int* a; //zeiger auf den anfang deines arrays mit zahlen cout<<"Wie viele zahlen sollen sortiert werden? "; cin>>iArrayLength; //das array ist jetzt ordentlich aufm heap reserviert //und kommt niemanden mehr in die quere a=new int[iArrayLength]; //eingabe for(int i=0; i<iArrayLength; i++){ cout<<"Geben Sie die "<<i<<". Zahl ein:"; cin>>a[i]; } //iSortedNumbers gibt an, wie weit das array schon sortiert ist //iCheckedNumbers gibt an, //welche zahlen beim jeweiligen durchgang bereits verglichen wurden int iTemp; //hier wird ein wert beim vertauschen zwischengespeichert //sortieren for(int iSortedNumbers=0; iSortedNumbers<iArrayLength; iSortedNumbers++){ for(int iCheckedNumbers=iSortedNumbers+1; iCheckedNumbers<iArrayLength; iCheckedNumbers++){ if(a[iSortedNumbers]>a[iCheckedNumbers]){ //werte vertauschen iTemp=a[iSortedNumbers]; a[iSortedNumbers]=a[iCheckedNumbers]; a[iCheckedNumbers]=iTemp; } } } //ausgeben for(i=0; i<iArrayLength; i++){ cout<<"Die "<<i<<"-kleiste Zahl ist :"<<a[i]<<endl; } delete[] a; //aufräumen return 0; }wie man sieht, kommt man insgesammt mit 3 variablen und einem array aus, ohne den ganzen durcheinander.
- du hast jetzt zwar den speicherplatz für 100 zahler reserviert, es ist aber nach wie vor möglich, über die grenzen hinauszuschreiben, und ist meistens sowieso speicherplatzverschwendung= keiner wird da je rumsitzen und 100 zahlen eintippen wollen
-
was das "b" in deinem beispiel darstellen soll, weiß ich überhaupt nicht, wozu brauchst du denn das?
- wo bleiben denn die ganzen klammer bei if(){ } und for(){ } blöcken? schreib die immer hin, auch wenn da nur eine zeile reinkommt!
weglassen kannst du die später, wenn du sowieso schon weisst, was dein programm tut.
- wo bleiben denn die ganzen klammer bei if(){ } und for(){ } blöcken? schreib die immer hin, auch wenn da nur eine zeile reinkommt!