Sortierverfahren(die zweite)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Sortierverfahren(die zweite)

Beitrag von Eradikator »

Hallo,
ich hab jetzt das Sortierverfahren "Quicksort" programmiert. Nur leider wird die Liste erst beim zweiten Aufruf der Prozedur sortiert. Beim ersten Aufruf wird die unsortierte
Liste ausgegeben. Woran könnt das liegen?

Code: Alles auswählen

 
procedure quicksort ( anfang, ende : integer; feld : tstrings);
var
  i, k : integer;
begin
  i:=anfang;
  k:=ende;
  if anfang<ende then
  begin
    while i<k do
    begin
      try                    //Beides Zahlen
        strtoint (feld[i]);
        strtoint (feld[i+1]);
        if strtoint (feld[i+1])<strtoint (feld[i])then
        begin
          feld.Exchange(i, i+1);
          i:=i+1;
        end
        else
        begin
          feld.Exchange(i+1, k);
          k:=k-1;
        end;
      except try            //Nur feld[ind+1] ist eine Zahl
        strtoint (feld[i+1]);
        feld.Exchange(i, i+1);
        i:=i+1;
      except try            //Nur feld[ind] ist eine Zahl
        strtoint (feld[i]);
        i:=i+1;
      except                //Beides sind keine Zahlen
        if feld[i+1]<feld[i]then
        begin
          feld.Exchange(i, i+1);
          i:=i+1;
        end
        else
        begin
          feld.Exchange(i+1, k);
          k:=k-1;
        end;
      end;
      end;
      end;
    end;
    quicksort (anfang,i-1, feld);
    quicksort (i+1, ende, feld);
  end;
  end;                                 
 
Hier der Code für den Aufruf:

Code: Alles auswählen

 
if CQuick.Checked=true then //Aufruf Quicksort
  begin
    anfang:=0;
    ende:=memo5.Lines.Count-1;
    QueryPerformanceFrequency(freq);
    QueryPerformanceCounter(startTime);
    memo5.Clear;
    memo5.lines.AddStrings(memo1.Lines);
    quicksort(anfang, ende, memo5.lines);
    QueryPerformanceCounter(endTime);
    edit4.Text:=(IntToStr((endTime - startTime) * 1000 div freq));
  end
  else
  begin
    memo5.Clear;
    edit4.Clear;
  end; 
 
mit freundlichen Grüßen

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Sortierverfahren(die zweite)

Beitrag von m.fuchs »

Du solltest deinen Komponenten mal vernünftige Namen geben und nicht Memo4 und Memo5. Wenn du das getan hast schau dir noch einmal deinen Aufruf von deinem Quicksort an. Du wirst den Fehler sicher schnell sehen.

Wenn nicht, frag noch einmal nach.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Re: Sortierverfahren(die zweite)

Beitrag von Eradikator »

Hi,
die Namensgebung ist zugegebenermaßen etwas ungeschickt, aber ich sehe den Fehler leider immer noch nicht, denn
beim ersten Anklicken des Buttons "Sortieren" bei gesetztem Häckchen in der Checkbox unter Memo5 wird die unsortierte
Liste in Memo5 angezeigt. Erst wenn ich den Button nochmal anklicke wird die sortierte Liste angezeigt.

mit freundlichen Grüßen

Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Re: Sortierverfahren(die zweite)

Beitrag von Eradikator »

Hab den Fehler gefunden.

Code: Alles auswählen

 
if CQuick.Checked=true then //Aufruf Quicksort
  begin
    QueryPerformanceFrequency(freq);
    QueryPerformanceCounter(startTime);
    memo5.Clear;
    memo5.lines.AddStrings(memo1.Lines);
    anfang:=0;
    ende:=memo5.Lines.Count-1;
    quicksort(anfang, ende, memo5.lines);
    QueryPerformanceCounter(endTime);
    edit4.Text:=(IntToStr((endTime - startTime) * 1000 div freq));
  end                                                                
 
ich hatte die Variable "ende" initialisiert bevor ich "memo5.lines.AddStrings(memo1.Lines);" initialisiert hatte.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Sortierverfahren(die zweite)

Beitrag von m.fuchs »

Ok, so herum geht es auch. Ich hatte es als falsch angesehen, dass du ende mit memo5.Lines.Count-1 füllst. Stattdessen wäre memo4 dann richtig gewesen.

Deswegen der Hinweis mit der Umbenennung. Memo4 -> Ausgangsliste, Memo5 -> Zielliste. Dann wäre klar, dass die Ausgangsliste als maßgebliche Quelle für ende genutzt werden sollte.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Re: Sortierverfahren(die zweite)

Beitrag von Eradikator »

Ach so,

Missverständnis: Ich habe insgesamt 8 Memofelder. 1 für die unsortierte Liste und 7 für die verschiedenen Sortierverfahren,
Aber nur 7 Editfelder für die Anzeige der Laufzeit der einzelnen Sortierverfahren. Daher gehörte Edit4 zu Memo5.
Mittlerweile habe ich die Komponenten umbenannt.

Danke schön.

Antworten