Autor |
Beitrag |
locke24
Hält's aus hier
Beiträge: 2
|
Verfasst: Sa 04.11.06 14:05
Ich möchte in einer Listbox Zufallszahlen erzeugen, die dann per bubblesort sortiert werden sollen, um in einer anderen Listbox ausgegeben zu werden.
Mein Quellcode sieht so aus:
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:
| procedure bubblesort; const anz= 50; var feld1: array [1..anz] of integer; i: integer; anzahl:integer; k:integer;
begin for i:=1 to (anz-1) do begin for anzahl:= 50 downto (i+1) do begin if feld1[k] > feld1[k-1] then begin feld1[k]:= feld1[k-1]; END; Form1.ListBox2.Items.Add(IntToStr(feld1[k-1]));
end; end; end;
procedure TForm1.Button2Click(Sender: TObject); begin close end; procedure TForm1.Button3Click(Sender: TObject); const max=50; var zahlfeld: array [1..50] of integer; i:integer; begin randomize ; for i:=1 to 50 do zahlfeld[i]:= random(50)+1; for i:=1 to 50 do Form1.Listbox1.Items.Add(IntToStr(zahlfeld[i]));
end;
end. |
Nun ja, also das mit den Zahlen sortieren funktioniert ja, aber die bubblesort prozedur muss ja dann mit den Zahlen aus der ersten Listbox arbeiten, nur ich weiß nicht, was ich in der Prozedur schreiben muss, damit sie diese Zahlen dann auch verwendet. Das ist eigentlich im Moment mein größtes Problem. Vielleicht funktioniert das ganz ja auch überhaupt nicht so, wie ich es mir vorgestellt habe...im Moment bin ich so ziemlich verwirrt, deshalb wäre ich für nützliche Hinweise sehr dankbar. Ähm ja schönes Wochenende noch
Moderiert von Gausi: B- durch Delphi-Tags ersetzt
Moderiert von Tino: Titel geändert.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 04.11.06 14:10
Hallo,
Bitte benutze doch die Delphi-Tags [delphi ] [/delphi]!
Du musst ja irgendwo angeben, was sortiert werden soll, in diesem Fall den Inhalt deiner Listbox:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Function BubbleSort(Items: TStrings): TStrings; var done: boolean; i, n: integer; Dummy: string; begin n := Items.Count; repeat; done := true; for i := 0 to n - 2 do if Items[i] > Items[i + 1] then begin Dummy := Items[i]; Items[i] := Items[i + 1]; Items[i + 1] := Dummy;
done := false; end; until done; result := Items; end; |
Aufruf dann mit
Delphi-Quelltext 1:
| listbox2.Items := Bubblesort(Listbox1.Items); |
Sortiert allerdings beide Listboxen  .
Schönes Wochenende,
Marc
|
|
locke24 
Hält's aus hier
Beiträge: 2
|
Verfasst: Sa 04.11.06 15:08
Okay,
vielen Dank für die schnelle Hilfe!
|
|
Saubäär
      
Beiträge: 376
|
Verfasst: Sa 04.11.06 16:21
Quelltext 1:
| Sortiert allerdings beide Listboxen :roll:. |
Nur ListBox1 wird sortiert aber du ordnest ListBox2 ja auch eine sortierte Liste (ListBox1) zu !
Gruß
Bäär
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 04.11.06 16:31
ja, ich weiß
ich habe mich falsch ausgedrückt 
|
|
DamienArriens
Hält's aus hier
Beiträge: 2
Win8
|
Verfasst: Fr 27.04.18 18:02
Ich Habe eine viel einfachere Variation für die die es später mal brauchen.
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:
| procedure TForm1.bubblesort; var a,b,dummy:string; anzahl:integer; i,j:integer; begin
anzahl := (listbox1.items.count - 1);
for j := 1 to anzahl do begin
for i := 1 to anzahl do begin a := listbox2.Items[i-1]; b := listbox2.Items[i];
if a < b then begin dummy:=a; listbox2.items[i-1]:=b; listbox2.items[i]:=dummy; end; end; end; end; |
Wenn man in der Liste die kleinste Zahl/String oben haben will muss man nur das Vorzeichen bei "a < b" umdrehen.
Moderiert von Christian S.: Quote- durch Delphi-Tags ersetzt
Zuletzt bearbeitet von DamienArriens am Sa 28.04.18 00:32, insgesamt 1-mal bearbeitet
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Fr 27.04.18 19:33
DamienArriens hat folgendes geschrieben : | Ich Habe eine viel einfachere Variation für die die es später mal brauchen. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.bubblesort; var a,b,dummy:string; anzahl:integer; i,j:integer; begin
anzahl := (listbox1.items.count - 1);
for j := 1 to 100 do ... end; | |
Einfacher vielleicht, aber dafür fehlerhaft. Wenn die Anzahl der notwendigen kompletten Durchläufe 100 überschreitet, hast Du eine Liste, die nicht komplett sortiert ist. Das wird zB ziemlich sicher der Fall sein, wenn die Liste invers sortiert ist und die Anzahl größer als 101 ist.
Edit: Wenn anderseits die Liste bereits sortiert ist, machst Du 99 Durchläufe für die Katz.
|
|
DamienArriens
Hält's aus hier
Beiträge: 2
Win8
|
Verfasst: Sa 28.04.18 00:33
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Sa 28.04.18 09:31
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 30.04.18 14:51
Nuja, diese neue Variante ist aus mehrerlei Hinsicht nicht so optimal.
Zum einen wird dort in der Sortiermethode auch noch direkt auf die visuellen Komponenten zugegriffen, was man in der Regel vermeiden sollte. Zum anderen geht es hier laut dem Threadtitel von vor 12 Jahren darum, Zahlen zu sortieren. Du sortierst aber Strings.
Mit deiner Prozedur sortierst du also sowas:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| 1 1005 125 13 14 2567 28 39876 41 |
Sicherlich nicht ganz das, was man von einer sortierten Zahlenfolge erwarten würde. 
_________________ We are, we were and will not be.
|
|