Autor Beitrag
Ezreal
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 12.12.10 18:42 
nabend,

ich soll buchstaben sortieren und dazu verschiedene sortierverfahren benutzen.
bubblesort ist fertig, als nächstes ist minimumsort bzw. selectionsort an der reihe.
jedoch bin ich gerade dabei an meinem algorithmus für selectionsort zu verzweifeln...
es funktioniert teilweise schon ganz gut, allerdings werden genauso gerne auch mal buchstaben verschluckt/verändert.

das programm funktioniert so: es werden eine bestimmte anzahl von panels (zwischen 2-15, array namens Buchstaben) erstellt und mit einem zufälligen buchstaben als caption ausgestattet.
diese sollen jetzt sortiert werden.

problem: ist die buchstabenfolge schon sortiert, macht er totalen mist :S ebenso weist er einem panel gerne mal einen anderen buchstaben zu...

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:
27:
28:
29:
procedure TForm1.MiniSort;
var n,position, untergrenze:integer;
    minBuchstabe, zwischen1:char;
    zwischenfarbe:tcolor;
begin

  untergrenze := 1;
  position := 1;

  REPEAT
    minBuchstabe := Buchstaben[untergrenze].Caption[1];
    FOR n:=untergrenze TO buchstabenanzahl DO
      begin
        IF Buchstaben[n].Caption[1] < minBuchstabe
        THEN
          begin
            minBuchstabe := Buchstaben[n].Caption[1];
            position := n;
          end;
      end;

    zwischen1 := Buchstaben[untergrenze].Caption[1];
    Buchstaben[untergrenze].Caption := minBuchstabe;
    Buchstaben[position].Caption := zwischen1;
    inc(untergrenze);

  UNTIL untergrenze > buchstabenanzahl-1;

end;


ich war eigentlich der meinung, dass dieser weg den algorithmus zu realisieren recht gut klappen wird, nur kann ich meinen denkfehler einfach nicht finden.
ich denke dass mir einfach eine bessere abbruchbedingung fehlt und da fällt mir keine ein.
ich bin dankbar für jede hilfe.
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 12.12.10 21:51 
Hmm, für mich ein bisschen unübersichtlich, sodass ich jetzt direkt keinen Fehler finde.
Wie wäre es denn die einzelnen Buchstaben mit Chr() in Integer-Zahlen umzuwandeln und die dann zu sortieren?
Wäre denke etwas übersichtlicher und einfacher zu warten in meiner Meinung.

Lg
Ezreal Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 12.12.10 23:17 
ich bin der meinung dass das egal ist, meinte mein lehrer auch...

dann versuche ich halt nochmal ein bisschen zu erklären.

es wird ja bekannterweise das minimum von den buchstaben ermittelt und mit dem ersten buchstaben getauscht.
so wird in der schleife immer das minimum sowie dessen position ermittelt. der erste buchstabe der reihe wird zwischengespeichert, an die erste
stelle kommt das gefundene minimum und der ehemalige erste buchstabe, der im zwischenspeicher ist, kommt an die stelle wo das minimum ursprünglich war (position).
die untergrenze erhöht sich dann, da ja nur noch die restlichen buchstaben angesehen werden müssen.

diesen vorgang soll er solange machen bis die buchstabenfolge sortiert ist. (da liegt unter anderem meiner meinung nach einer meiner knackpunkte :S ich weiß einfach nicht wie ich ermitteln soll wann die folge sortiert ist... :/)

auf anfrage lade ich auch einfach mal das programm hoch? eventuell ist eine fehleranalyse dann leichter?

lieber gruß und gute nacht
Ezreal Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 13.12.10 00:03 
mhmkay, hab jetzt die lösung, ein kumpel hat mir geholfen (danke xyz, du bist klasse!)

und zwar fehlte mir eine abfrage ob der buchstabe nicht schon an der richtigen stelle ist ;)
warum einfach wenns auch schwer gehen kann :D

für alle interessierten hier der richtige quelltext der prozedur:

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:
procedure TForm1.MiniSort;
var n,position, untergrenze:integer;
    minBuchstabe, zwischen1:char;
    zwischenfarbe:tcolor;
    done:boolean;
begin

  untergrenze := 1;
  position := 1;

 REPEAT
    done:= true;
    minBuchstabe := Buchstaben[untergrenze].Caption[1];

    FOR n:=untergrenze TO buchstabenanzahl DO
      begin
        IF Buchstaben[n].Caption[1] < minBuchstabe
        THEN
          begin
            done := false;
            minBuchstabe := Buchstaben[n].Caption[1];
            position := n;
          end;
      end;

    IF done = false
    THEN
      begin
        zwischen1 := Buchstaben[untergrenze].Caption[1];
        Buchstaben[untergrenze].Caption := minBuchstabe;
        Buchstaben[position].Caption := zwischen1;
      end;

    IF (untergrenze < buchstabenanzahl)
    THEN inc(untergrenze);

  UNTIL (untergrenze = buchstabenanzahl);

  BitBtnSort.Enabled := false;
end;