Entwickler-Ecke

Sonstiges (Delphi) - Zahlen per Bubblesort sortieren


locke24 - Sa 04.11.06 14:05
Titel: Zahlen per Bubblesort sortieren
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:


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. - 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 + 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

Delphi-Quelltext
1:
listbox2.Items := Bubblesort(Listbox1.Items);                    

Sortiert allerdings beide Listboxen :roll:.

Schönes Wochenende,
Marc


locke24 - Sa 04.11.06 15:08

Okay,

vielen Dank für die schnelle Hilfe!


Saubäär - 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 ! :wink:

Gruß
Bäär


Marc. - Sa 04.11.06 16:31

ja, ich weiß
ich habe mich falsch ausgedrückt ;)


DamienArriens - 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  // 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


Gammatester - 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.

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 - 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.

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 - 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 - 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. ;-)