Sepidar عزیز که تو سایت دیدم خیلی خیلی کارت درسته ! نمی دونم که حسش رو پیدا کردی یا نه ! ولی برای بقیه می نویسم که :
الگوریتم Quick sort که به روش بازگشتی کار می کنه به این ترتیبه که از ابتدا و انتهای یک آرایه شروع می کنه و یک عدد رو مبنا می کنه و حرکت می کنه ! هر جا که در مسیر رو به جلو ( از ابتدا ) به عددی برخورد کرد که از مبنا بزرگتر بود متوقف می شه و بر عکس در مسیر رو به عقب ( جرکت از انتها ) هم عدد کوچکتر از مبنا ببینه متوقف می شه ! و بعد جای این دو تا رو عوض می کنه ! زمانی که این دو تا اشاره گر به هم برسند یعنی تمام عناصز قبل از این اشاره گر از مبنا کوچکتر و بعد از اشاره گر از مبنا بزرگترند. بنابراین آرایه به دو زیر آرایه تقسیم می شه و با همین روش هر دو زیر آرایه مرتب می شن. فقط اینجا برای من یک نکته مبهمه که چرا مبنا رو میانگین دو عدد ابتدا و انتها گرفته ؟ به نظر من باید مبنای ما عدد ابتدا باشد و جای این عدد دقیقا جایی است که دو اشاره گر به هم می رسند. در واقع به نظر من الگوریتم باید به این صورت باشد
PROCEDURE Quick;
PROCEDURE PartialSort(Left,Right:WORD);
VAR
L1,R1,I,J,K:WORD;
BEGIN
K:=A[Left]; { Reza Jasbi }
I:=Left+1;
J:=Right;
REPEAT
WHILE A[I]<K DO
Inc(I,1);
WHILE K<A[J] DO
Dec(J,1);
IF I<=J THEN
BEGIN
Switch(A[I],A[J]);
Inc(I,1);
Dec(J,1);
END;
UNTIL I>J;
Switch(A[Left],A[J]); { Reza Jasbi }
IF Left<J THEN
PartialSort(Left,J);
IF Right>I THEN
PartialSort(I,Right);
END;
BEGIN
PartialSort(1,MaxArray);
END;