Einzelnen Beitrag anzeigen

Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#10

Re: Ich bitte um Erklärung eines Quellcodes

  Alt 17. Jun 2009, 09:08
Delphi-Quellcode:
  //auch wieder irgendwas mit ner Anzeige, die die Mitte, des Sortierbereichs zeigt?
  mitte := Kollektion[(linkerzeiger+rechterzeiger)div2];
Hi erstmal, ich denk die mitte ist hier das Pivot Element (wollt ich nur gesagt haben weil du den kommentar als Frage gestellt hast).

Was ein Pivot Element ist bitte aus WP entnehmen.

Delphi-Quellcode:
  if anfang < rechterzeiger then
    quicksort(anfang, rechterzeiger, Vergleiche, swaps); //Hier habe ich wieder ein PRoblem mit dem Aufruf Quciksort
Das ist würde ich jetzt mal sagen der Rekursive aufruf um die erhaltenen Teillisten zu sortieren, oder täusche ich mich?

until rechterzeiger < linkerzeiger; //kompiliert das, so ohne Repeat? Würde mich fast etwas wundern, ist da evtl das repeat verlorgen gegangen? also theoretisch müsse es doch wohl gleich hinterm begin der prozedur hin, nicht oder?

  linkerzeiger, rechterzeiger : Cardinal; //imho recht sinnlose lokale Kopien der Parameter Nein, denke ich nicht, er nutzt sie zum inkrementieren und dekrementieren.

Hab noch meine Kommentare hinzugefügt:
Delphi-Quellcode:
Procedure TWortListe.Quick; //verbessert?
begin
  //ich denk mal die sind globale Zähler oder Felder, die hier zurückgesetzt werden
  Vergleiche :=0;
  Swaps :=0;
  //PegelStart ist eine Prozedur, deren Implementierung du nicht gepostet hast, siehe Anmerkung zu Pegel
  PegelStart(round(Listenlaenge*log2(Listenlaenge)));
  //erster Parameter: "untere" sortierte Grenze, zweiter: "obere" sortierte Grenze
  //die anderen zwei Parameter zählen wohl die Vergleiche und Tauschoperationen mit (starten hier mit 0)
  quicksort(1,Listenlaenge,vergleiche,swaps);
end;

Procedure TWortListe.Quicksort(anfang, ende: Cardinal; var act, sw : Cardinal);
var
  linkerzeiger, rechterzeiger : Cardinal; //imho recht sinnlose lokale Kopien der Parameter
                                          //Hybrid666: Denke ich nicht, werden im quelltext inkrementiert und dekrementiert
                                          // Die werte anfang und ende werden auch wieder verwendet (sollen also nicht
                                          // verändert werden)
  mitte : string;
begin
  linkerzeiger := anfang;
  rechterzeiger := ende;
  //auch wieder irgendwas mit ner Anzeige, die die Mitte, des Sortierbereichs zeigt?
  //Hybrid666: Pivot-Element (siehe Wikipedia)
  mitte := Kollektion[(linkerzeiger+rechterzeiger)div2];
  Pegel.Position := Vergleiche; //Hier taucht der Pegel nochmal auf - vielleicht eine Progessbar o.ä.?
                                // Hybrid666: Denke auch, auf jedenfall wirds ne ausgabe sein, wieviele vergleiche gemacht wurden

  while(Kollektion[linkerzeiger]<mitte) do //warum zum Henker ein Stringvergleich?
                                           //Hybrid666: SUchen nach einem Element was auf die andere hälfte der
                                           // liste soll
  begin
    linkerzeiger := linkerzeiger+1;
    //Was ist act - Act ist ein var Parameter der Funktion - aus deinem oberen Aufruf raus zu schließen die Tauschanzahl
    inc(act);
  end;


  while(Kollektion[rechterzeiger]>mitte) do //siehe Schleife davor
                                            //Hybrid666: Tauschpartner im rechten teil für linken teil suchen
  begin
    rechterzeiger := rechterzeiger-1;
    inc(act); //Hier habe ich nochmal das selbe Problem
  end;

  if linkerzeiger <= rechterzeiger then //joa, der restliche Quicksort halt
  begin
    //ahh weil du eine Art Stringliste sortierst, damit ist dann auch Mitte klar (Privotelement)
    Tauschen(Kollektion[linkerzeiger],Kollektion[rechterzeiger]);
    linkerzeiger := linkerzeiger + 1;
    rechterzeiger := rechterzeiger - 1;
    inc(Swaps);
    inc(act);
  end; (*if*)
until rechterzeiger < linkerzeiger; //kompiliert das, so ohne Repeat?


  if anfang < rechterzeiger then
    quicksort(anfang, rechterzeiger, Vergleiche, swaps); //Hier habe ich wieder ein PRoblem mit dem Aufruf Quciksort
                                                         //Hybrid666: Rekursiver aufruf um die 2 erhaltenen Teillisten zu sortieren (hier die eine seite)
  if linkerzeiger < ende then
    quicksort(linkerzeiger,ende,Vergleiche,swaps); //Klammer = deine Parameter beim Aufruf, wie oben halt
                                                   //Hybrid666: Hier der aufruf für die andere seite

end; (*quicksort*)

MfG
  Mit Zitat antworten Zitat