Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Zahlen Sortieren...


Hemisch - Do 24.11.05 10:36
Titel: Zahlen Sortieren...
Guten Tag

Ich hätte da mal eine Frage.
Ich bin im Moment noch der absolute Neuling in Delphi und bin in meinem Übungsbuch auf eine Aufgabe gestossen, wo ich einfach nicht weiterkomme.

Hier die Frage:
Erzeugen Sie ein Projekt, welches drei von Ihnen eingegebene Zahlen sortiert und in der sortierten Reihenfolge ausgibt. Die Zahlen sollen vom Datentyp integer sein.

Wie mache ich das?


Danke für eure Hilfe im vorraus

Gruss Hemisch


Christian S. - Do 24.11.05 10:44

Hallo und :welcome: !

Es ist immer schöner, als Antwortender auf der Arbeit des Fragenden aufbauen zu können. Wie sieht denn Dein bisheriger Ansatz aus? Wenn er nicht funktioniert, werden wir den schon hinbiegen. :-)

Grüße
Christian


digi_c - Do 24.11.05 10:45

http://www.sortieralgorithmen.de/

Bei drei Zahlen ist die Wahl egal. Für den Anfang würde ich Bubblesort vorschlagen. Probier dich daran die dargestellten Algos in Delphi zu portieren. Lösungen findest du auf http://www.dsdt.info


Gausi - Do 24.11.05 11:21

Na, da direkt mit Sortieralgorithmen zu kommen, halte ich für übertrieben. Da merkt man doch sofort, dass da von irgendwoher eine dicke Hilfe gekommen ist.

Man kommt mit 3 Abfragen aus:

Nennen wir die drei Zahlen a,b,c. Sortieren tun wir das dann so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Wenn a grösser b, dann vertausche a und b.
(a ist ja vorne auf keinen Fall richtig, weil ja b kleiner ist)

Wenn jetzt b größer c, dann vertausche b und c.
(Dann steht ja das b auch nicht an der richtigen Stelle (das könnte auch das alte a sein..), also vertauschen wir das um eins nach hinten.
Jetzt steht die größte Zahl schonmal ganz hinten.)

(Jetzt noch einmal überprüfen, ob vorne alles stimmt:)
Wenn jetzt a größer b, dann vertausche a und b.
(An die Profis: Das entspricht dem Bubblesort-Verfahren)
Und das muss man jetzt nur noch in Delphi-Code umschreiben...

Hilfreich dabei dürfte StrToInt und IntToStr sein.


Hemisch - Do 24.11.05 12:44

So... danke euch allen, ich habe es jetzt geschafft!:D

Ich habe es wie folgt gemacht (falls es jemand interessiert):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  tmpWert:string;
begin
  if  (strtoint(edit1.text))>(strtoint(edit2.text)) then begin
    tmpWert:=edit1.text;
    edit1.text:=edit2.text;
    Edit2.text:=tmpWert;
  end;
  if  (strtoint(edit2.text))>(strtoint(edit3.text)) then begin
    tmpWert:=edit2.text;
    edit2.text:=edit3.text;
    Edit3.text:=tmpWert;
  end;
  if  (strtoint(edit1.text))>(strtoint(edit2.text)) then begin
    tmpWert:=edit1.text;
    edit1.text:=edit2.text;
    Edit2.text:=tmpWert;
  end;
end;
end.


Aber ich habe mir überlegt das dies nur mit 3 Edits funktioniert... wie ginge das wohl mit 4 oder gar 10 Edits die man anordnen muss?

mfg Hemisch


digi_c - Do 24.11.05 14:04

Achsooooo ja natürlich kann man bei 3 Werten mit Ausschluss arbeiten. Hab gedacht das war variabel :(


Hemisch - Do 24.11.05 18:17
Titel: It's Done!
Endlich habe ich es geschafft...

Hier der Quelltext:


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.Button1Click(Sender: TObject);
var
  i,a:integer;
  edt1,edt2,edt3,edt4,edt5:string;
  tmpWert:String;
begin
  edt1:=edit1.text;
  edt2:=edit2.text;
  edt3:=edit3.text;
  edt4:=edit4.text;
  edt5:=edit5.text;
  Listbox1.Items.Add(edt1);
  Listbox1.Items.Add(edt2);
  Listbox1.Items.Add(edt3);
  Listbox1.Items.Add(edt4);
  Listbox1.Items.Add(edt5);
  for a:=0 to 100 do begin
    for i:=0 to (Listbox1.Items.Count -2do begin
      IF (StrToInt(Listbox1.Items.Strings[i]))>(StrToInt(Listbox1.Items.Strings[i+1])) then begin
        tmpWert:=Listbox1.Items.Strings[i];
        Listbox1.Items.Strings[i]:=Listbox1.Items.Strings[i+1];
        Listbox1.Items.Strings[i+1]:=tmpWert;
      end;
    end;
  end;
end;


PS:Is das normal das man als Anfänger daran über 3.5 Stunden braucht?

mfg Hemisch

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


GTA-Place - Do 24.11.05 20:35

Hier würde ich dir noch ein Array und Suche in der Entwickler-Ecke FINDCOMPONENT empfehlen für die Edits.


PS: Denke das ist normal. Ich brauch manchmal für vergleichbares auch so lang ^^


bole - Fr 25.11.05 22:56

Dein Sortieralgorithmus funktioniert zwar, aber du machst etwas viel... sich bei 5 Zahlen ist der Unterschied im millisekunden Bereich aber wenn es etwas mehr sind kann das schon was ausmachen.

Für die Profis: Mir ist schon bewusst, dass Bubblesort für nicht wirklich optimal, weil langsam ist...

In deinem Programm durchläufst Du die aussere Schleife konstant 100 mal. nötig ist aber nur ein durchlauf weniger als es Elemente zu sortieren gibt.

Eine weitere Optimierung ergibt sich eine Eigenschaft von Bubblesort. Da nach jedem Durchlauf das höchste Element an richtigen Ort ist muss es nicht mehr geprüft werden. Somit kann die innere Schleife immer kleiner werden.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
BEGIN
  FOR i := minsort+1 TO maxSort DO
  BEGIN
    FOR j :=  maxSort DOWNTO i  DO
    BEGIN
      IF sortar[j-1] > sortar[j] THEN
        tauschen(j,j-1);
    END;
  end;
end;


Ich find super das Du nicht gleich die Flinte ins Korn geworfen hast! :D Ich habe sicher schon an einfacheren Problemen länger gehabt und als Programmier-Anfänger würde ich mich nicht bezeichnen...