Autor Beitrag
liquid air
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 76



BeitragVerfasst: Mi 27.09.06 23:34 
So, ich bin dabei als kleine Übung einen Quicksort-Sortieralgorithmus zu schreiben; Wem dies nichts sagt:
Ich habe eine Menge an Zahlen die ich sortieren will. Nun nehme ich die letzte Zahl aus diesem Feld und bezeichne sie als "pivot"; nun wird die Menge in zwei Teilmengen unterteilt; In die Menge1 kommen alle Elemente kleiner als pivot, in M2 alle die grösser gleich pivot sind. Dann werden die Teilmengen nochmal unterteilt, so lange, bis nur noch Mengen mit 1 oder 2 Elementen da sind, und somit die Gesamtmenge sortiert ist.
(Es könnte auch etwas anders sein, ich habes es jedenfalls so verstanden, falls es nicht stimmt entwickel ich halt hier meinen eigenen Alg. -.- Wens interessiert kann sich z.B. bei wiki die genaue Formel ansehn.)

Nun möchte ich dies mit einer repeat-until-schleife machen; Ich weiss nicht genau ob das die schlauste Version ist, aber ich muss dazusagen, dass ich ein absoluter Anfänger in Sachen Delphi bin und deshalb auch durchaus noch nicht so gekonnt mit dem Umgang damit ^^'. Ich möchte aber auch darum bitten, dass mir keine komplette alternativvorschläge gemacht werden bei denen ich alles komplett neu und mit Syntaxa die ich absolut noch nie gehört habe...
Darum also: Versucht mir bitte bei meinem konkreten Problem zu helfen, ins Detail muss ich später noch gehen, und dann meld ich mich schon nochmal ^^

Also, momentan sieht die Sache so aus:
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:
procedure TForm1.SortierenClick(Sender: TObject);
var i, j, k, p, pivot, temp: integer; //zus. arr, ar1, ar2: arrays of integer; global definiert
begin

    p:=high(arr)-1;
    pivot:=arr[p];


    for j:=low(arr) to (pivot-1do begin        //ar1 definieren
      setlength(ar1,((pivot-1)-(low(arr))));
      for i:=low(arr) to high(arr) do begin
        if arr[i]<pivot then begin
          ar1[j]:=arr[i];
          listbox2.items.Add(inttostr(ar1[j]));
        end;
      end;
    end;


    for k:=pivot to (high(arr)) do begin         //ar2 definieren
      setlength(ar2, ((high(arr)-pivot)));
      for i:=low(arr) to high(arr) do begin
        if arr[i]>=pivot then begin
          ar2[k]:=arr[i];
          listbox3.items.Add(inttostr(ar2[k]));
        end;
      end;


end;
end;


Wie ihr (vllt) sehen könnt versuche ich die beiden Teilmengen zu definieren, indem ich zunächst vom Anfang bis zum Ende von ihnen untersuche ob die Elemente der Gesamtmenge in ar1 oder ar2 gehören. (Die umständliche Doppelschleifenkombination beruht darauf, dass ich nicht besser wusste, wie ich sagen kann: "Wenn die Zahl in diese Menge gehört dann schmeiss sie einfach rein", sondern ich musste ja die Elemente der Teilmengen exakt definieren, eben mit einer Schleife, da die Elemente ja sonst nicht wissen welche Position sie in der Teilmenge haben)

Listbox2 und 3 stellen hier eine Kontrolle dar, um mir die beiden Teilmengen konkret anschaun zu können...

Naja, jedenfalls gibts n Error o_O Und das ist dann eigentlich auch meine Frage: Warum? xD




Nun will ich nur noch loswerden dass es mir leidtut dass ich so ne geschwollen unklare Redensart hier hab, schiebts darauf dass ich mich nich besser ausdrücken kann mit delphi, bin n newb in dem Gebiet, wie gesagt...Und müde ausserdem auch.




Also, danke im Voraus für die Hilfe >> MfG Matthias
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1258

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 27.09.06 23:39 
Moin!

user profile iconliquid air hat folgendes geschrieben:
Naja, jedenfalls gibts n Error o_O Und das ist dann eigentlich auch meine Frage: Warum? xD

Ah, gut dass du nicht dazu sagst, WELCHER Fehler und womöglich sogar WO er auftritt - macht doch immer den ganzen Ratespaß kaputt... :roll:

user profile iconliquid air hat folgendes geschrieben:
einen Quicksort-Sortieralgorithmus zu schreiben;
[...]
Es könnte auch etwas anders sein, ich habes es jedenfalls so verstanden, falls es nicht stimmt entwickel ich halt hier meinen eigenen Alg. -.- Wens interessiert kann sich z.B. bei wiki die genaue Formel ansehn.)

Und du meinst, es wäre nicht vielleicht doch sinnvoll, einfach mal den Standard-Quicksort vor deiner Version davon zu probieren? Nur für den Fall, dass Quicksort vielleicht doch anders ist, als du verstanden hast... !? :lol:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
liquid air Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 76



BeitragVerfasst: Mi 27.09.06 23:58 
user profile iconNarses hat folgendes geschrieben:

Ah, gut dass du nicht dazu sagst, WELCHER Fehler und womöglich sogar WO er auftritt - macht doch immer den ganzen Ratespaß kaputt... :roll:


ja okay ich geb zu das is vllt nich so schlau...Naja also das is nunmal so dass ich die Errors eigentlich nich wirklich versteh und ich kann mir halt nur schwer vorstellen dass jemand mit "Exception: EInvalidPointer" was anfangen kann ^^' Außerderm dachte ich dass ihr Pros mit eurem geübten Auge direkt sehen könnt: "aah da, das da geht ja garnich, der hat ja vergessen das array lang genug zu machen" oder sowas...
Und zum Thema wo: Ich vermute dass es in dem zweiten Durchlauf (das mit k) ist, weil wenn ich den Teil weglasse kommt zwar kein error, aber eine Ausgabe über die listboxes kommt auch nicht...Von daher isses wohl mit einem Error nicht getan, es werden wohl mehrere Folgefehler oder Logikfehler oder so sein...


edit: achso ja und zu dem "erstmal den original algorithmus ausrpobieren"...Also das soll jetz nich aggressiv klingen oder so aber kannst du dir vorstellen wie abartig KOMPLIZIERT alles informatikbezogene bei wiki für einen Anfänger ist??? Ich musst mir erstmal in aller Ruhe klarwerden was dieses Omega in 5 versionen sein soll, un dann isses nich leichter geworden...Also um ehrlich zu sein ich bekomm da eigentlich nur Frust wenn ich mir das anguck, und ich kann dir sagen als Neuer kann man damit so garnix anfangen :roll: Ich mein klar, wenn da n quellcode stehn würd den ich einfach nur abtippen müsste würd ichs machen...aber...da da keiner is bzw der so kompliziert und voller syntaxa is von dnene ich eben aufgrund meiner noch geringen Kenntnisse noch nie was gehört hab, sie infolge dessen also auch nicht verstehe, nutzt mir das nix. ...sry ^^''
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1258

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 28.09.06 00:04 
Moin!

Also, du machst da ja spannende Sachen... :lol:
user profile iconliquid air hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.SortierenClick(Sender: TObject);
var i, j, k, p, pivot, temp: integer; //zus. arr, ar1, ar2: arrays of integer; global definiert
begin
    p:=high(arr)-1;
    pivot:=arr[p];

    for j:=low(arr) to (pivot-1do begin        //ar1 definieren
[...]
    end;

    for k:=pivot to (high(arr)) do begin         //ar2 definieren
[...]
      end;
end;
end;

Du liest einen Wert aus dem Array und verwendest ihn dann in der Schleife?! :nixweiss:

Bitte, wenn dir das Wort "Rekursion" nichts sagt, dann versuch doch erstmal BubbleSort, hm? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
liquid air Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 76



BeitragVerfasst: Do 28.09.06 00:22 
also gut pass mal auf, nur um mal n paar sachen zu klären...
1) Ich habe sehr wohl bubblesort als auch selectionsort schon programmiert
2) Ich weiss was rekursion ist und ich hab auch gesagt dass ich das ganze mit ner repeatuntil schleife machen will, worüber ich mir in dem augenblick aber noch keine gedanken gemacht hab weil ich erstmal eine mengenteilung hinkriegen will, danach kann ich mir immer noch angucken wie ich die rekursive schleife machen kann
3) es hilft mir abolut nicht wenn du einfach nur das wort an den Kopf schmeisst...
4) ich kann auch um ehrlich zu sein nicht verstehn was ich denn so unsinniges mache in deinen Augen; ich mein ich muss doch schliesslich die grenze festlegen für die beiden Mengen, und die is eben nunmal pivot...o_O was is daran falsch??

so, und noch als letztes: Nur weil ich weniger Ahnung habe als du gibt dir das imo nicht das Recht mich hier zu behandeln wie ein kleines Kind, und auch nicht über meine Fähigkeiten als Programmierer bzw meine Ideen zu lachen. Also würde ich dich bitten ein Bisschen darauf zu achten wie du mit mir redest, einfach aus Freundlichkeit und der Tatsache dass ich halt nunmal leider auch nur einen 12er Informatik kurs belegt hab un nich im 4. semester studiere. Falls du damit ein Problem haben solltest lade ich dich herzlich ein mir nicht zu helfen und Andere die Arbeit machen zu lassen, danke.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1258

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 28.09.06 00:30 
Moin!

OK, offene Worte sind angesagt, dann geht´s los: Du kommst bei mir rüber, wie ein Schüler, der dem Lehrer auf die Nerven geht, weil er etwas weiter ist, als die andern und um Ruhe zu haben, gibt er dir ne Aufgabe, an der du zu knabbern hast. :mrgreen: Na, wie hab ich geraten? :D

user profile iconliquid air hat folgendes geschrieben:
3) es hilft mir abolut nicht wenn du einfach nur das wort an den Kopf schmeisst...

OK, seh ich ein, also hier der QuickSort-Algo:
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:
procedure QuickSort(Links,Rechts: Integer);
var
  Pivot,i,j,temp: Integer;
begin
  Pivot := (Links + Rechts) div 2;
  Pivot := F[Pivot];
  i := Links;
  j := Rechts;
  repeat
    while (F[i] < Pivot) do
      Inc(i);
    while (Pivot < F[j]) do
      Dec(j);
    if (i <= j) then begin
      temp := F[i];
      F[i] := F[j];
      F[j] := temp;
      Inc(i);
      Dec(j);
    end;
  until (i > j);
  if (links < j) then
    QuickSort (Links,j);
  if (i < Rechts) then
    QuickSort (i,Rechts);
end;

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
liquid air Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 76



BeitragVerfasst: Do 28.09.06 00:41 
user profile iconNarses hat folgendes geschrieben:
OK, offene Worte sind angesagt, dann geht´s los: Du kommst bei mir rüber, wie ein Schüler, der dem Lehrer auf die Nerven geht, weil er etwas weiter ist, als die andern und um Ruhe zu haben, gibt er dir ne Aufgabe, an der du zu knabbern hast. :mrgreen: Na, wie hab ich geraten? :D


beschissen.

aufgepasst ich sag dir wies aussieht: unser lehrer is der wohl unfähigste lehrer den man sich nur vorstellen kann, er vermittelt keinen unterrichtstoff, sondern gibt uns im prinzip nur grobe übersichten über die themen die er gerade "bearbeitet". Es hieß dann also in der letzten stunde "so dann beschäftigt euch mal damit wie man zahlen sortieren kann", das war alles. wir also spontan alle was entwickelt frei kopf hauptsächlich ohne recherchen, und was am schluss rauskam waren dann meistens bubblesort. dann haben wir halt mal wiki geguggt was es noch so gibt, und n paar kollegen haben eben alles mögliche ausprobiert, und ich wollte eben mal quicksort machen, einfach als gute übung, da wir morgen nämlich kursarbeiten schreiben; ich vermute zwar dass bubblesort da vollkommen reichen würde, aber wie gesagt; ne übung. ...und btw als ansatz hat mir eigentlich nur dieses viel zu schnelle gif gedient, das is alles.


nun, du siehst, lagst vollkommen daneben :P ich bin einfach nur jemdand der weiss dass er beschissene kenntnisse hat in info un das ändern will, und zu diesem zwecke ein paar beispiele machen will.

aber gut, genug der bösen wortgefechte ^^ vielen dank für den quellcode, ich versuch den mal in aller ruhe zu verdauen...und übrigens: inc und dec hab ich nich gekannt ;) siehste mal, dass ich darauf so schnell nich kommen konnte...
und du meinst, ich würde mit mienem ansatz nich weiterkommen? das is frustrierend weil ich mir da soviele gedanken gemacht habe :( kann doch nich sien dass das alles umsonst war...un dass ich noch nichmal kapier was ich falsch gemacht hab >_>
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1258

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 28.09.06 00:51 
Moin!

user profile iconliquid air hat folgendes geschrieben:
und übrigens: inc und dec hab ich nich gekannt ;) siehste mal, dass ich darauf so schnell nich kommen konnte...

Und die DOH hast du auch nicht gekannt, hm? :lol: Schon klar... ;)

user profile iconliquid air hat folgendes geschrieben:
und du meinst, ich würde mit mienem ansatz nich weiterkommen? das is frustrierend weil ich mir da soviele gedanken gemacht habe :( kann doch nich sien dass das alles umsonst war...un dass ich noch nichmal kapier was ich falsch gemacht hab >_>

Ja, ich meine, dass dein Ansatz eine Sackgasse ist (zumindest für dich; man kann zwar beweisen, dass jeder rekursive Algorithmus auch Iterativ machbar ist, das heißt aber nicht, dass das leicht machbar wäre. :D Und Quicksort ist nun mal DAS rekursive Paradebeispiel... ;)).

Zu deinem Fehler: Du liest einen Wert aus dem Array und verwendest ihn in der Schleife als Grenze deines Arrays. Das ist im Allgemeinen ein schwerer Fehler! Beispiel: Du liest aus dem Array pivot := arr[p], und sagen wir mal, da steht eine 1000 drin. Was passiert wohl in der Schleife, wenn dein Array aber nur 100 Elemente hat? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
liquid air Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 76



BeitragVerfasst: Do 28.09.06 00:59 
user profile iconNarses hat folgendes geschrieben:
Und die DOH hast du auch nicht gekannt, hm? :lol: Schon klar... ;)

sry...DOH?? was solln das jetzt wieder sein ^^''

Zitat:
Zu deinem Fehler: Du liest einen Wert aus dem Array und verwendest ihn in der Schleife als Grenze deines Arrays. Das ist im Allgemeinen ein schwerer Fehler! Beispiel: Du liest aus dem Array pivot := arr[p], und sagen wir mal, da steht eine 1000 drin. Was passiert wohl in der Schleife, wenn dein Array aber nur 100 Elemente hat? ;)


jaaaa klar das versteh ich und das war mir von anfang an bewusst aber ich dachte so wie ich das gemacht habe habe ich pivot so definiert dass nicht die anzahl der elemente entscheident ist sondern ihr wert!! also bei deinem bsp soll das ja nicht heissen dass alle zahlen unter dem index 1000 € M1 sein sollen, sondern alle zahlen DEREN WERT unter 1000 sind!! und das dürfte ja wohl keine komplikationen herbeiführen oder??
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1258

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 28.09.06 01:06 
Moin!

user profile iconliquid air hat folgendes geschrieben:
user profile iconNarses hat folgendes geschrieben:
Und die DOH hast du auch nicht gekannt, hm? :lol: Schon klar... ;)

sry...DOH?? was solln das jetzt wieder sein ^^''

Inc eintippen und F1 drücken :arrow: Delphi Online Hilfe ;)

user profile iconliquid air hat folgendes geschrieben:
Zitat:
Zu deinem Fehler: Du liest einen Wert aus dem Array und verwendest ihn in der Schleife als Grenze deines Arrays. Das ist im Allgemeinen ein schwerer Fehler! Beispiel: Du liest aus dem Array pivot := arr[p], und sagen wir mal, da steht eine 1000 drin. Was passiert wohl in der Schleife, wenn dein Array aber nur 100 Elemente hat? ;)

jaaaa klar das versteh ich und das war mir von anfang an bewusst aber ich dachte so wie ich das gemacht habe habe ich pivot so definiert dass nicht die anzahl der elemente entscheident ist sondern ihr wert!! also bei deinem bsp soll das ja nicht heissen dass alle zahlen unter dem index 1000 € M1 sein sollen, sondern alle zahlen DEREN WERT unter 1000 sind!! und das dürfte ja wohl keine komplikationen herbeiführen oder??

Dein Code von weiter oben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    pivot:=arr[p]; // nehmen wir an, arr[p] enthält 1000, also ist pivot = 1000
 
    for j:=low(arr) to (pivot-1) do begin // damit läuft die Schleife bis 999
      setlength(ar1,((pivot-1)-(low(arr))));  
      for i:=low(arr) to high(arr) do begin  
        if arr[i]<pivot then begin  
          ar1[j]:=arr[i]; // wenn ar1 weniger als 999 Elemente hat, dann knallt´s hier!
:shock:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
liquid air Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 76



BeitragVerfasst: Do 28.09.06 01:16 
jaaa du bist witzig ich mein wenn ich inc da stehn hab kann ich nachgucken was das is klar hab ich ja auch gemacht eben ^^ aber andersrum gehts ja nich :D ich wollte doch nur sagen dass ich vorher den begriff nicht kannte, sondern alles was ich wusste war dass ich vllt was gebrauchen könnte was was anders irgendiwe erhöht ^^ und damit kann ich nurn leider nix anfangen in der hilfe...hätt ich schon müssen googlen etc und da hab ichs dann halt auf meine weise versuche ^^





jaaaa aber ich verstehs wirklich net oO

pivot:=arr[p] mit p = 1000

dann is doch pivot nich 1000!! sondern den wert den das array an der stelle (dem index) 1000 hat, und da das array ja nur mit zufallszahlen von 1 bis kA 20 oder so gefüllt is kann das ja nur ne zahl zwischen 1 und 20 sein ^^
bwvor wir wieder aneinander vorbeireden; so seh ich das:

ein array mit 5 elementen
array[2; 10; 42; 3; 17] --> klar soweit? was ich mein? (falsche schreibweise aber weisst doch wie ich mein)

dann wäre array[1]=2, array[2]=10 .... oder etwa nicht????
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1258

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 28.09.06 01:25 
Moin!

user profile iconliquid air hat folgendes geschrieben:
jaaa du bist witzig ich mein wenn ich inc da stehn hab kann ich nachgucken was das is klar hab ich ja auch gemacht eben ^^ aber andersrum gehts ja nich :D ich wollte doch nur sagen dass ich vorher den begriff nicht kannte, sondern alles was ich wusste war dass ich vllt was gebrauchen könnte was was anders irgendiwe erhöht ^^

Ne, schon klar, auf j := j +1; kommt man nicht selber, dafür braucht man schon Inc(j); (und das auch nur mit Hilfe der Hilfe...) 8)

user profile iconliquid air hat folgendes geschrieben:
jaaaa aber ich verstehs wirklich net oO

pivot:=arr[p] mit p = 1000

dann is doch pivot nich 1000!! sondern den wert den das array an der stelle (dem index) 1000 hat,

Ja, genau das habe ich ja auch geschrieben, arr[p] enthält z.B. 1000, dann ist der Wert von pivot anschließend doch wohl 1000, oder? ;)

user profile iconliquid air hat folgendes geschrieben:
ein array mit 5 elementen
array[2; 10; 42; 3; 17] --> klar soweit? was ich mein? (falsche schreibweise aber weisst doch wie ich mein)

dann wäre array[1]=2, array[2]=10 .... oder etwa nicht????

Abgesehen davon, dass dann array[0] = 2, array[1] = 10, etc. ist, ja, seh ich auch so. ;)

Aber:
ausblenden Delphi-Quelltext
1:
2:
3:
pivot := arr[2]; // jetzt ist pivot = 42
for j := low(arr] to (pivot-1do // die Schleife läuft bis 41
  arr[j] := egal; // hier knallt´s, weil das array nur 5 Elemente hat!

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 28.09.06 09:56 
Na gut, dann will ich auch mal. :D

Ehrlich gesagt, verstehe ich deine Schleifenkonstruktion nicht. Ich befürchte auch, dass da einiges an Grundlagen fehlt, weil einige Zeilen imho überhaupt keinen Sinn machen. Und den Quicksort-Algorithmus kann ich darin auch nicht erkennen.

Ich versuche mal, Quicksort zu erklären:

Gegeben ist eine Zahlenfolge, nennen wie sie arr, mit n Elementen.
Der Sortieralgorithmus läuft wie folgt.

Wähle ein Pivot-element (z.B. das letzte, ist aber nicht zwingend nötig).

Laufe die Folge von vorne durch, bis ein Element gefunden wurde, was größer als das Pivot-Element ist und merke diese Position.
Laufe dann die Folge von hinten durch, bis ein Element gefunden wurde, was kleiner ist als das Pivotelement.
Tausche diese beiden Zahlen.
Fahre mit dem durchlaufen der Zahlenfolge fort, bis man sich in der Mitte trifft.
Tausche das Pivotelement in die Mitte der Zahlenfolge.

Ganz grob sähe das dann so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
vorn := 0
hinten := n-2;  
pivot := arr[n-1];

repeat
  while (arr[vorn] <= pivot) AND (vorn < n-1do inc(vorn);
  while (arr[hinten] >= pivot) AND (hinten > vorn) do dec(hinten);

  if hinten > vorn then
    //die Funktion tausche muss man sich selbst bauen, das sind drei Zeilen
    tausche(arr[vorn], arr[hinten])
until vorn > hinten
// jetzt das Pivot-element arr[n-1] in die Mitte tauschen
// hier kommts recht genau auf den Index an, wahrscheinlich vertu ich mich um +/- 1/2
tausche(arr[pivot], arr[hinten] {+-1?} )


Anschließend müssen die beiden Teilarrays sortiert werden. Am besten einfach wieder mit Quicksort. Dazu brauchen wir als Parameter das Array, was die Zahlenfolge enthält, sowohl die beiden Grenzen, innerhalb derer sortiert werden soll. Also:
ausblenden Delphi-Quelltext
1:
2:
MeinQicksort(arr, 0, vorn {+-1?});
MeinQuicksort(arr, vorn {+-1?}, n-1);


Jetzt müssen wir nur noch den Kopf der Prozedur anpassen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure MeinQuicksort(arr: Array of Integer; linkeGrenze, rechteGrenze: integer);
begin
  vorn := linkeGrenze; 
  hinten := rechteGrenze - 1;  
  pivot := arr[rechteGrenze];
  // weiter wie oben


Das kann man jetzt noch für Testzwecke so modifizieren, dass zwischen durch das Array in einer Listbox o.Ä. ausgegeben wird. Aufgerufen wird der Sortiervorgang dann natürlich so:
ausblenden Delphi-Quelltext
1:
MeinQuicksort(arr, 0, high(arr));					

_________________
We are, we were and will not be.