Problem mit Pointern beim Quicksort-Algorhytmus
-
Hallo, ich schreibe grade eine Funktion die eine Start und Endadresse auf dem Arbeitsspeicher nimmt, und die integer größen darin sortiert.
aber irgendwie scheint er irgendwas mit den Zeigern zu verkacken... er kompiliert eins a, und gibt mir dann eine Gleitkomma ausnahme zurück...#include<iostream> using namespace std; void QS(int* start,int* end) { int laenge=0; for(int i=0;&start[i]!=end;i++)laenge++; laenge/=4; int pivo=rand()%laenge; pivo=*(start+pivo); string klein,gross; int pivo_counter=0; for(int i=0;i<laenge;i++) { if( *(start+i) < pivo ) klein += *(start+i); if( *(start+i) > pivo ) gross += *(start+i); else pivo_counter++; } int laenge_klein=klein.size(); int laenge_gross=gross.size(); for(int i=0;i<laenge_klein;i++) *(start+i)=(int)klein[i]-48; for(int i=0;i<pivo_counter;i++) *(start+laenge_klein+i)=pivo; for(int i=0;i<laenge_gross;i++) *(start+laenge_klein+pivo_counter+i)=(int)gross[i]-48; int* start_klein=start; int* end_klein=start+laenge_klein; int* start_gross=start+laenge_klein+pivo_counter+1; int* end_gross=start+laenge_klein+pivo_counter+laenge_gross; QS(start_klein,end_klein); QS(start_gross,end_gross); } int main() { int test[5]={ 1, 3, 2 , 4, 1}; int* start=&test[0]; int* end=&test[4]; QS(start,end); for(int i=0;i<5;i++)cout<<test[i]; cin.get(); return 1; }Vielen dank im Vorraus...
-
Habs nur schnell getestet. Du dividierst in folgender Zeile:
[cpp]
int pivo=rand()%laenge;
[code]Durch 0. D.h. Laenge ist 0. Muss irgendetwas mit deiner Rekursion zu tun haben.
-
Habe das Programm bearbeitet, war wirklich ein sehr dummer fehler^^ Hat auch sonst nich mit dem algorhytmus harmoniert, so wie er laufen soll..
hier die neue: das Problem besteht aber weiterhin..
#include<iostream>
using namespace std;
void QS(int* start,int* end)
{
int laenge=0;
for(int i=0;&start[i-1]!=end;i++)laenge++;
cout<<"länge: "<<laenge<<endl;
int pivo=rand()%laenge;
pivo=start[pivo];
string klein,gross;
int pivo_counter=0;
cout<<"pivo: "<<pivo<<endl;for(int i=0;i<laenge;i++)
{
if( start[i] < pivo ) {klein += (char)start[i];} //
if( start[i] > pivo ) gross += (char)start[i];
else pivo_counter++;
}
int laenge_klein=klein.size();
int laenge_gross=gross.size();for(int i=0;i<laenge_klein;i++)
*(start+i)=(int)klein[i]-48;for(int i=0;i<pivo_counter;i++)
*(start+laenge_klein+i)=pivo;for(int i=0;i<laenge_gross;i++)
(start+laenge_klein+pivo_counter+i)=(int)gross[i]-48;
int start_klein=start;
int* end_klein=&start[laenge_klein];
int* start_gross=&start[laenge_klein+pivo_counter+1];
int* end_gross=&start[laenge_klein+pivo_counter+laenge_gross];
if(laenge_klein>=2)
QS(start_klein,end_klein);
if(laenge_gross>=2)
QS(start_gross,end_gross);
}int main()
{
int test[7];
test[0]=2;
test[2]=3;
test[3]=5;
test[4]=4;
test[1]=8;
test[5]=13;
test[6]=-2;
int* start=&test[0];
int* end=&test[6];
QS(start,end);
for(int i=0;i<5;i++)cout<<start[i];
cin.get();
return 1;}
[cpp]
-
Ich schau es mir gerade noch einmal an. Zu erst einmal solltest du in der
main Funktion 0 zurückgeben, sonst ist es ein Fehler-Rückgabewert. Und
zweitens solltest du als erstes einen Prototyp deiner Funktion anlegen, und
dann erst die Funktion definieren!
-
So, ich hab es mir jetzt mal weiter angeschaut: was soll denn bitte folgende
Zeilen bedeuten?if( start[i] < pivo ) {klein += (char)start[i];} if( start[i] > pivo ) gross += (char)start[i];
-
Ich speichere die jeweils kleineren beziehungsweise größeren vergleichszahlen in jeweiligen strings ab.
Mein Shema sollte eigentlich so laufen:
Nimm anfangs und endadresse
nimm eine stichprobe
vergleiche alle damit und merke was kleiner oder größer war
schreibe nun den speicher neu in der Form #kleinere#stichprobe#größere
fahre fort mit dem speicherbereich in dem kleinere gespeichert ist
dann mit dem wo größere drin gespeichert ist..ich danke für deine hilfe^^
-
HAbe das ganze noch einmal generalüberholt. jetz müssten meiner ansicht nach uch alle adressen soweit stimmen ;,-)
#include<iostream> using namespace std; void QS(int* start,int* end) { int laenge=0; for(int i=0;&start[i-1]!=end;i++)laenge++; cout<<"länge: "<<laenge<<endl; int pivo=rand()%laenge; pivo=start[pivo]; string klein="",gross=""; int pivocounter=0; cout<<"pivo: "<<pivo<<endl; for(int i=0;i<laenge;i++) { if( start[i] < pivo ) {klein += (char)start[i];} // if( start[i] > pivo ) gross += (char)start[i]; else pivocounter++; } int laenge_klein=klein.size(); int laenge_gross=gross.size(); for(int i=0;i<laenge_klein;i++) start[i]=(int)klein[i]; for(int i=0;i<pivocounter-1;i++) start[laenge_klein+i]=pivo; for(int i=0;i<laenge_gross;i++) start[laenge_klein+pivocounter+i]=(int)gross[i]; int* start_klein=start; int* end_klein=&start[laenge_klein-1]; int* start_gross=&start[laenge_klein+pivocounter]; int* end_gross=&start[laenge_klein+pivocounter+laenge_gross-1]; klein="";gross=""; for(int i=0;i<laenge;i++)cout<<start[i]<<" "; cout<<endl; if(laenge_klein>1) QS(start_klein,end_klein); if(laenge_gross>1) QS(start_gross,end_gross); } int main() { int test[7]; test[0]=6; test[1]=71; test[2]=3; test[3]=5; test[4]=2; test[5]=13; test[6]=7; int* start=&test[0]; int* end=&test[6]; QS(start,end); for(int i=0;i<5;i++)cout<<start[i]; cin.get(); return 0; }
-
Es ist fertig, war etwas ganz triviales. else vor dem 2. if vergessen^^
Wer es sich nochmal ansehen mag:
#include<iostream> using namespace std; void QS(int* start,int* end) { int laenge=0; for(int i=0;&start[i-1]!=end;i++)laenge++; int pivo=rand()%laenge; pivo=start[pivo]; string klein="",gross=""; int pivocounter=0; for(int i=0;i<laenge;i++) { if( start[i] < pivo ) {klein += (char)start[i];} else // if( start[i] > pivo ) {gross += (char)start[i];} else {pivocounter++;} } int laenge_klein=klein.size(); int laenge_gross=gross.size(); for(int i=0;i<laenge_klein;i++) start[i]=(int)klein[i]; for(int i=0;i<pivocounter;i++) start[laenge_klein+i]=pivo; for(int i=0;i<laenge_gross;i++) start[laenge_klein+pivocounter+i]=(int)gross[i]; int* start_klein=start; int* end_klein=&start[laenge_klein-1]; int* start_gross=&start[laenge_klein+pivocounter]; int* end_gross=&start[laenge_klein+pivocounter+laenge_gross-1]; klein="";gross=""; if(laenge_klein>1) QS(start_klein,end_klein); if(laenge_gross>1) QS(start_gross,end_gross); } int main() { string test; getline(cin,test); int array[1000]; for(int i=0;i<test.size();i++)array[i]=(int)test[i]; int* start=&array[0]; int* end=&array[test.size()-1]; QS(start,end); start=&array[0]; for(int i=0;i<test.size();i++)cout<<(char)start[i]<<" "; cin.get(); return 0; }weiß jemand wie ich integer variablen dynamisch speichern kann? also um das int array[1000] zu vermeiden^^