Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Sortieren mit BubbleSort
-delphin- - Sa 04.06.05 18:22
Titel: Sortieren mit BubbleSort
Also ich habe ein Programm geschrieben, das eine Liste einer ausgewählten Anzahl zufälliger Zahlen in einer ListBox (LBRandom) mit BubbleSort sortieren soll. Das Ganze sieht so aus:
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| unit UBubbleSort;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const max = 100; type TForm1 = class(TForm) LBRandom: TListBox; LBSort: TListBox; LRandom: TLabel; EAnzahl: TEdit; LSort: TLabel; BRandom: TButton; BSort: TButton; LAnzahl: TLabel; procedure BRandomClick(Sender: TObject); procedure BSortClick(Sender: TObject); private public end;
var Form1: TForm1;
Menge: array [1..max] of integer;
implementation
{$R *.dfm}
procedure TForm1.BRandomClick(Sender: TObject); var i, Anzahl : integer; begin randomize; Anzahl := StrToInt(EAnzahl.Text); for i:=1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max)+1)); end;
procedure TForm1.BSortClick(Sender: TObject); var i,j,merke,anzahl:integer; begin LBSort.Items.clear; anzahl:=High(Menge); for i:=1 to anzahl do begin for j:=anzahl downto i do begin if Menge[j]<Menge[j-1] then begin merke:=Menge[j]; Menge[j]:=Menge[j-1]; Menge[j-1]:=Menge end end end; for i:=1 to anzahl do begin LBSort.items.add(IntToStr(Menge[i])); end end;
end. |
In der Zeile
merke:=Menge[j]; kommt allerdings der Fehler eines Variablenkonfliktes mit Integer (merke) und Array (Menge). Daher bräuchte ich den Umrechnungscode.. sowas wie ArrToInt oder so funktioniert nicht, die Delphi-Hilfe hat mir auch nicht weitergeholfen.
Thx im Vorraus,
Delphin^^
Maweki - Sa 04.06.05 18:44
sollte doch
heissen, oder??
und mach mal Leerzeichen ;)
Edit:
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| unit UBubbleSort;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const max = 100;
type TForm1 = class(TForm) LBRandom: TListBox; LBSort: TListBox; LRandom: TLabel; EAnzahl: TEdit; LSort: TLabel; BRandom: TButton; BSort: TButton; LAnzahl: TLabel; procedure BRandomClick(Sender: TObject); procedure BSortClick(Sender: TObject); private public end;
var Form1: TForm1; Menge: array [1..max] of Integer; implementation {$R *.dfm} procedure TForm1.BRandomClick(Sender: TObject); var i, Anzahl: Integer; begin Randomize; Anzahl := StrToInt(EAnzahl.Text); for i := 1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max) + 1)); end;
procedure TForm1.BSortClick(Sender: TObject); var i, j, merke, anzahl: Integer; begin LBSort.Items.clear; anzahl := High(Menge); for i := 1 to anzahl do for j := anzahl downto i do if Menge[j] < Menge[j - 1] then begin merke := Menge[j]; Menge[j] := Menge[j-1]; Menge[j - 1] := merke; end; for i := 1 to anzahl do LBSort.items.add(IntToStr(Menge[i])); end;
end. |
habs nochmal kurz formatiert...
-delphin- - Sa 04.06.05 18:55
Jetzt kommen in der Ausgabe der zweiten ListBox max - 1 Nullen (also im Moment 99) und als letztes immer die Zahl 9181752! Womit hängt das nun zusammen??
Maweki - Sa 04.06.05 19:00
weil du ausserhalb deines Arrays rumspielst...
Delphi-Quelltext
1:
| Menge: array [1..max] of Integer; |
und du greifst teilweise auf das Element [0] zu. Also aender das mal nach
Delphi-Quelltext
1:
| Menge: array [0 .. max] of Integer; |
bzw (max - 1)
Edit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.BSortClick(Sender: TObject); var i, j, merke, anzahl, Start: Integer; begin LBSort.Items.clear; Start := Low(Menge); anzahl := High(Menge); for i := Start + 1 to anzahl do for j := anzahl downto i do if Menge[j] < Menge[j - 1] then begin merke := Menge[j]; Menge[j] := Menge[j - 1]; Menge[j - 1] := merke; end; for i := Start to anzahl do LBSort.items.add(IntToStr(Menge[i])); end; |
-delphin- - Sa 04.06.05 19:02
jetzt sind nur noch max nuller und keine 9181 usw. mehr dahinter :/
Edit: nach deiner Lösung sind es max + 1 Nullen
Maweki - Sa 04.06.05 19:06
Zum ersten weist du Menge nie etwas zu...
Wird also komplett als null initialisiert (genauer gesagt 0).
Edit: natuerlich max + 1. Da die 0 ja dazu gehoert...
-delphin- - Sa 04.06.05 19:08
menge is ja mein array von 0 bis max. wie weise ich dem denn was zu und wozu benötige ich das?
Maweki - Sa 04.06.05 19:14
naja, das ding is ja voll mit nullen. Und die sortierst du und gibst sie aus. Ich denke mit der Zeile
Delphi-Quelltext
1: 2:
| for i := 1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max) + 1)); |
meinst du
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i := Low(Menge) to High(Menge) do begin Menge[i] := Random(max) + 1; LBRandom.Items.Add(IntToStr(Menge[i])); end; |
-delphin- - Sa 04.06.05 20:32
Naya jetz sortier er zwar ordnungsgemäß, aber jetz haben wir ja anzahl rausgehauen, deshalb kann man nicht mehr bestimmen, wie viele zahlen er erstellen soll
Maweki - Sa 04.06.05 20:36
wie jetzt?? Er macht den ganzen Array voll mit ZUfallszahlen. Schau in die Hilfe bzgl. Low und High wenn dir nciht ganz klar ist, was die bewirken...
-delphin- - Sa 04.06.05 22:27
jop aber ich hab ja noch ein editfeld, mit dem man entscheiden kann, wie viele zufallszahlen er erstellen soll. gespeichert werden die dann in anzahl (integer).
Maweki - Sa 04.06.05 22:43
und was genau soll dann max??
ich meine, du hast einen statischen array den du mit dynamisch vielen Zahlen fuellst um ihn dann im ganzen auszulesen und zu sortieren ohne ihn ueberhaupt zu fuellen.
Ergibt fuer mich nich sonderlich viel Sinn ;)
-delphin- - Sa 04.06.05 22:48
Max ist einfach nur der Zahlenbereich, aus dem Zahlen genommen werden. Im Anhang ist das prog (;
Maweki - So 05.06.05 07:03
nein, denn max ist auch die Laenge deines Arrays...
und imho hast du in deinem hochgeladenen Code nichts geaendert.
Zum ersten zwei eine empfehlung:
halte dich bitte an den Delphi Styleguide (
DELPHI STYLEGUIDE)
dein Code ist wirklich nicht schoen zu lesen.
Nochmal:
Delphi-Quelltext
1: 2:
| for i:=1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max)+1)); |
Du schreibst soviele Zufallszahlen in eine ListBox, wie in einem Editfeld angegeben wurde. Und das alles im Bereich eins bis inkl. max.
und in deinem Bubblesort-Code sortierst du den array Menge, den du nirgendswo mit Werten gefuellt hast...
Du sortierst NICHT LBRandom sondern den max Langen leeren(!) array Menge.
Also, nicht wundern, wenn bei der Sortierung eines leeren Arrays nur nullen als Ergebnis kommen. Das Verhalten ist absolut logisch und gerechtfertigt...
-delphin- - So 05.06.05 12:13
und wie änder ich das? oO
Maweki - So 05.06.05 12:17
aendere das hier noch ein wenig ab, sodass es deinen Anforderungen enspricht.
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i := Low(Menge) to High(Menge) do begin Menge[i] := Random(max) + 1; LBRandom.Items.Add(IntToStr(Menge[i])); end; |
du musst entweder nur den Array fuellen und ihn dann anzeigen, oder du fuellst den Array und die Liste parallel.
Aber im Moment fuellst du nur die Liste und sortierst dann den array...
-delphin- - So 05.06.05 13:29
hm aber der array wird doch gefüllt durch den random befehl in der schleife
Maweki - So 05.06.05 13:34
wo bitteschoen? In deinem eigenen Code zumindest nicht...
Verion - Do 09.06.05 20:35
Ich denke du meinst diese Zeile:
Delphi-Quelltext
1:
| LBRandom.Items.Add(IntToStr(Random(max)+1)); |
dadurch füllst du aber, wie gesagt nur deine listbox.
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i:=1 to Anzahl do begin Menge[i] := Random(max)+1; LBRandom.Items.Add(IntToStr(Menge[i])); end; |
damit sollten dein array und deine listbox eigentlich gefüllt sein. Ich habe mich jetzt allerdings nur mit dem füllen des arrays beschäftigt und nicht geguckt ob das mit dem Rest deines Quelltextes zusammenpasst ;)
mfg
Verion
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!