Entwickler-Ecke
Sonstiges (Delphi) - BubbleSort funktioniert nicht
anx - Fr 04.12.09 21:14
Titel: BubbleSort funktioniert nicht
Hallo,
kann mir jemand sagen, warum diese Prozedur bei mir nicht funktioniert. Ich finde einfach den Fehler nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| var Form1: TForm1; arr:array[0..7] of integer; size:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin randomize(); size:=8; for i:=0 to 7 do arr[i]:=random(50); end;
procedure BubbleSort(); var i,j,swp:integer; begin for i:=0 to size-1 do begin for j:=0 to size-i-1 do begin if arr[j+1] < arr[j] then begin swp:=arr[j+1]; arr[j+1]:=arr[j]; arr[j]:=swp; end; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Label1.Caption:=''; BubbleSort(); for i:=0 to 7 do Label1.Caption:=Label1.Caption + IntToStr(arr[i]) + ' '; end;
end. |
Vielen Dank
anx
elundril - Fr 04.12.09 21:32
weil dein code vollkommen anders aussieht als der Pseudocode von
wikipedia [
http://de.wikipedia.org/wiki/Bubblesort] aussieht? Ich würd dir mal raten das du den versuchst möglichst 1 zu 1 umzusetzen und dann schaust ob du vielleicht schleifentypen austauschen kannst usw. ;)
lg elundril
anx - Fr 04.12.09 22:53
Hallo,
was ist denn das für eine Begründung? Wikipedia ist nicht das universelle Vorbild ;). Ich habe nämlich den C++ Code einfach übersetzt und wundere mich warum es in Delphi nicht funktioniert. Falls es jemandem hilft. So sieht der C++ Code aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| void BubbleSort() { for(int i=0; i<size;i++) { for(int j=0; j<size-i;j++) { if (arr[j+1]<arr[j]) { int swp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=swp; } } } } |
Könnt ihr mir helfen?
Vielen Dank
lg, anx
elundril - Fr 04.12.09 22:58
schon klar, aber der pseudocode in Wikipedia ist ja auf jeden fall richtig, demnach startest du schon mit was 100% richtigem. ;)
anx hat folgendes geschrieben : |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| void BubbleSort() { for(int i=0; i<size;i++) { for(int j=0; j<size-i;j++) { if (arr[j+1]<arr[j]) { int swp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=swp; } } } } |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure BubbleSort(); var i,j,swp:integer; begin for i:=0 to size-1 do begin for j:=0 to size-i-1 do begin if arr[j+1] < arr[j] then begin swp:=arr[j+1]; arr[j+1]:=arr[j]; arr[j]:=swp; end; end; end; end; |
|
das einzige was mir auf die schnelle auffällt ist, das was ich gehighlightet hab. da verwendest du jeweils unterschiedliche indizes.
anx - Fr 04.12.09 23:08
ja, aber wie man sieht ist das das komplett gleiche! In C++ funktioniert es, aber hier....hä? Bitte helft mir weiter!
Vielen, vielen Dank
lg, anx
PS.: "Size" sollte nicht in der FormCreate Methode stehen, doch auch bei Verbesserung hilft das gar nichts! Delphi ist irgendwie komisch ;) (auch wenn bekannt ist, dass der Dumme immer vor dem Bildschirm sitzt).
anx - Fr 04.12.09 23:44
Sicher, dass ich da auf ein solches ELement zugreife? Ich sehe das irgendwie nicht. Ich glaube nicht, dass hier ein Debugger hilft. Ich mache ja irgendeinen Übersetzungsfehler von C++ nach Delphi, doch finde ich diesen nicht!
VIelen Dank für die Hilfe
lg, anx
elundril - Fr 04.12.09 23:48
size-i-1 = 8-0-1 = 7 = oberstes element in deinem array
wenn du jetzt j + 1 rechnest dann hast du 7+1=8= größer als der index des obersten elements. ;)
und der debugger hilft insofern das du genau siehst wie welche elemente verschoben werden und auch siehst was du ev. falsch machst. ;)
anx - Sa 05.12.09 15:23
Nein, das stimmt nicht. size-i-1 ist die Obergrenze der Schleife und nicht j. j geht nur bis dahin und steigt ab 0 auf. Da es eben immer kleiner als size ist, wird auch auf kein nicht vorhandenes Objekt zugegriffen.
Ich finde einfach den Fehler nicht. Ich habe es doch eins zu eins aus C++ übernommen und dort funktioniert es.
Vielen Dank für die Hilfe und bitte helft weiter ;)
lg, anx
Kha - Sa 05.12.09 15:40
anx hat folgendes geschrieben : |
Da es eben immer kleiner als size ist, wird auch auf kein nicht vorhandenes Objekt zugegriffen. |
Eben: j ist immer kleiner als size, j+1 allerdings nicht.
anx - Sa 05.12.09 15:47
Achso...könntet ihr vielleicht meinen Code irgendwie verbessern, denn ich weiß einfach nicht weiter. ICh habe das jetzt ausprobiert aber es bringt nichts. Das wäre lieb!
Vielen Dank
lg, anx
---
Moderiert von
Narses: Beiträge zusammengefasst---
Ich habs hinbekommen, indem ich mir noch ein paar Beispiele angeguckt habe. Wahrscheinlich ist das der Grund warum die eine Schleife immer andersherum als die andere geht. Ich habe das nämlich erst nicht eingesehen und es wie oben versucht. Wie wir gesehen haben, funzt das nicht!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure BubbleSort(); var i,j,swp:integer; begin for i:=size-1 downto 1 do begin for j:=0 to i-1 do begin if (arr[j+1]<arr[j]) then begin swp:=arr[j]; arr[j]:=arr[j+1]; arr[j+1]:=swp; end; end; end; end; |
Vielen Dank
lg, anx
---
Moderiert von
Narses: Beiträge zusammengefasst---
Ich habe doch noch eine Frage. Eigentlich muss es doch "downto 0" heißen, da das letzte Element 0 ist, oder? Ich habe ja das Array folgendermaßen deklariert:
arr:array[0..7] of integer;
Vielen Dank
lg, anx
elundril - Sa 05.12.09 16:27
wenn du jetzt downto 0 schreibst hast du das selbe problem wie oben. wenn i dann bei 0 angekommen ist (0 wird ja noch ausgeführt) und du dann in der innneren schleife i-1 schreibst bist du ja irgendwann beim index -1 und index -1 ist n fehler. ;)
Sowas sollte es doch auch in C++ geben, das man nicht auf Felder von nem Array zugreifen darf die gar ned existieren. :gruebel:
lg elundril
Jakob_Ullmann - Sa 05.12.09 16:33
Also 1.: Es gibt hier eine Editierfunktion.
2.: Warum versuchst du denn nicht, den Wikipedia-Code umzusetzen? Würde ich eher machen, als eine C++ nach Delphi Übersetzung zu starten.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| prozedur bubbleSort( A : Liste sortierbarer Elemente ) n := Länge( A ) wiederhole vertauscht := falsch für jedes i von 1 bis n - 1 wiederhole falls A[ i ] > A[ i + 1 ] dann vertausche( A[ i ], A[ i + 1 ] ) vertauscht := wahr ende falls ende für n := n - 1 solange vertauscht und n >= 1 prozedur ende |
die Konstruktion für jedes (...) wdh. solange (...) kannst du sowohl mit for als auch mit repeat-until umsetzen.
Kha - So 06.12.09 00:12
anx hat folgendes geschrieben : |
Eigentlich muss es doch "downto 0" heißen, da das letzte Element 0 ist, oder? |
Jupp, dann sollte es stimmen :D .
anx hat folgendes geschrieben : |
Wie wir gesehen haben, funzt das nicht! |
Du hättest lediglich die innere Schleife ein Element früher enden lassen müssen.
elundril hat folgendes geschrieben : |
wenn i dann bei 0 angekommen ist (0 wird ja noch ausgeführt) und du dann in der innneren schleife i-1 schreibst |
Wie oft wird eine for-Schleife von 0 bis -1 wohl ausgeführt ;) ?
elundril - So 06.12.09 16:19
:oops: sorry, mein fehler!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!