Autor Beitrag
locke24
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
procedure bubblesort;
const anz= 50;
var
 feld1: array [1..anz] of integer;
 i: integer;
 anzahl:integer;
 k:integer;

begin
for i:=1 to (anz-1do
begin
for anzahl:= 50 downto (i+1do
begin
if feld1[k] > feld1[k-1then
 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..50of 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 user profile iconGausi: B- durch Delphi-Tags ersetzt
Moderiert von user profile iconTino: Titel geändert.
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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:
ausblenden 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 + 1then
        begin
          Dummy := Items[i];
          Items[i] := Items[i + 1];
          Items[i + 1] := Dummy;

          done := false;
        end;
  until done;
 result := Items;
end;

Aufruf dann mit
ausblenden Delphi-Quelltext
1:
listbox2.Items := Bubblesort(Listbox1.Items);					

Sortiert allerdings beide Listboxen :roll:.

Schönes Wochenende,
Marc
locke24 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 04.11.06 15:08 
Okay,

vielen Dank für die schnelle Hilfe!
Saubäär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 376



BeitragVerfasst: Sa 04.11.06 16:21 
ausblenden Quelltext
1:
Sortiert allerdings beide Listboxen :roll:.					


Nur ListBox1 wird sortiert aber du ordnest ListBox2 ja auch eine sortierte Liste (ListBox1) zu ! :wink:

Gruß
Bäär
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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

BeitragVerfasst: Fr 27.04.18 18:02 
Ich Habe eine viel einfachere Variation für die die es später mal brauchen.



ausblenden 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  // Anzahl der ganzen Durchläufe
    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 user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von DamienArriens am Sa 28.04.18 00:32, insgesamt 1-mal bearbeitet
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Fr 27.04.18 19:33 
user profile iconDamienArriens hat folgendes geschrieben Zum zitierten Posting springen:
Ich Habe eine viel einfachere Variation für die die es später mal brauchen.
ausblenden 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  // Anzahl der ganzen Durchläufe
    ...
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

BeitragVerfasst: Sa 28.04.18 00:33 
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDamienArriens hat folgendes geschrieben Zum zitierten Posting springen:
Ich Habe eine viel einfachere Variation für die die es später mal brauchen.
ausblenden 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  // Anzahl der ganzen Durchläufe
    ...
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.



Tut mir leid hatte vergessen die '100' mit 'anzahl' auszutauschen dann geht es perfekt
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Sa 28.04.18 09:31 
user profile iconDamienArriens hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:

Edit: Wenn anderseits die Liste bereits sortiert ist, machst Du 99 Durchläufe für die Katz.


Tut mir leid hatte vergessen die '100' mit 'anzahl' auszutauschen dann geht es perfekt

Also für mich sind 99% Leerlauf nicht gerade perfekt. Was hast Du gegen ein Flag, das (zurück-)gesetzt wird, wenn Vertauschungen stattfinden?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:
ausblenden 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.