Autor Beitrag
e_t_grea
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Do 15.05.08 11:22 
Hi,

hab wieder mal eine Frage zu meiner Facharbeit, da sie aber nichts mit meinem letzten Thread zu tuhen hat, habe ich mich entschlossen, einen neuen aufzumachen.

Diesmal geht es um Quicksort. Ich habe ihn bereits programmiert und er sortiert auch so wie er soll, aber viel zu langsam!! Ich habe einfach mal ein Integer-Array mit hundert zufälligen Elementen erstellt und Quicksort durchlaufen lassen: Er benötigt sage und schreibe 8 Sekunden! Bubblesort braucht für exakt das gleiche Array (bzw. für die Kopie) nur ca. 2 - 3 sek. Hier mal der Quelltext, wobei er ja eigentlich funktionieren müsste:

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:
procedure Sort(var value:Array of Integer; b,e:Integer);

 procedure Exchange(var valueOne,valueTwo:Integer);
 var
  valuetemp  :Integer;
 begin
  valuetemp:=valueOne;
  valueOne:=valueTwo;
  valueTwo:=valuetemp;
 end;

var
 pivot   :Integer;
 i       :Integer;
 j       :Integer;
begin
 if b<e then
  begin
   pivot:=value[(b+e) div 2];
   i:=b;
   j:=e;
   repeat
    while value[j]>pivot do dec(j);
    while value[i]<pivot do inc(i);
    if (i<=j) then
     begin
      exchange(value[j],value[i]);
      inc(i);
      dec(j);
     end;
   DrawQuick(value);    //Hier wird das Diagramm gezeichnet, läuft nahezu identisch zu [url=http://www.delphi-forum.de/topic_Vorgang+eines+Sortieralgorithmuses+grafisch+darstellen_83315.html]DrawBubble[/url] ab
   QuickImage.Refresh   //Das Diagramm wird zur Ausgabe gezwungen
   until i>j;
   if b<j then Sort(value,b,j);
   if i<e then Sort(value,i,e);
  end;
end;


Das einzigste was ich mir vorstellen könnte, wäre das zeichnen des Säulendiagramms, aber dass kann eigentlich nicht die Ursache sein, denn das wird bei Bubblesort schließlich auch jedes mal gezeichnet.

Hoffentlich kennt einer von euch die Lösung, sonnst sieht es etwas komisch aus, wenn ich behaupte, Quicksort wär einer der schnellsten Algorithmen und gleichzeitig ist Bubblesort einer der langsamsten aber trotzdem schneller :lol:

Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Do 15.05.08 11:30 
Ich garantiere dir, dass es an den Zeichen-Routinen liegt. Kommentier einfach mal die Zeilen 31 und 32 aus und du müsstest eine Geschwindigkeitssteigerung um mindestens einen Faktor 100 (wenn nicht mehr) merken.

AXMD
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 15.05.08 11:32 
user profile icone_t_grea hat folgendes geschrieben:
Das einzigste was ich mir vorstellen könnte, wäre das zeichnen des Säulendiagramms, aber dass kann eigentlich nicht die Ursache sein, denn das wird bei Bubblesort schließlich auch jedes mal gezeichnet.

Ja, aber wichtig hier ist wohl wie oft das Säulendiagramm gezeichnet wird. ;-)

Reicht es nicht das Zeichnen außerhalb von Repeat-Until zu legen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
   repeat
    while value[j]>pivot do dec(j);
    while value[i]<pivot do inc(i);
    if (i<=j) then
     begin
      exchange(value[j],value[i]);
      inc(i);
      dec(j);
     end;
   until i>j;

   DrawQuick(value);    //Hier wird das Diagramm gezeichnet, läuft nahezu identisch zu DrawBubble ab
   QuickImage.Refresh   //Das Diagramm wird zur Ausgabe gezwungen


Gruß
Tino
e_t_grea Threadstarter
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Do 15.05.08 11:37 
danke, habs gefunden.

ich hab am anfang der sortieralgorithmen das diagramm jeweils einmal zeichnen lassen,
und dann etwas warten lassen (sleep(100)).
Da Quicksort ja rekursiv arbeitet wurde dass immer wieder ausgeführt,
hätte mir den Quelltext wharscheinlich erst noch mal in ruhe durchlesen sollen :oops:

Auf jeden Fall erst mal ganz doll vielen Dank.

P.S. wie peinlich :oops: