basics_quicksort.inc
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:3k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  Quicksort algorithm template
  3.  (C) Mirage (avagames@gmail.com)
  4. Usage:
  5. --------------------------
  6. procedure/function <Name>(N: Integer; Values: TValues - any array of _QSValueType);
  7. .type _QSDataType = <Your type>; [_QSValueType = <any comparable type>]
  8. .[<_QSGetValue or _QSCompare function body>]
  9. .[$DEFINE COMPARABLE | COMPUTABLE]
  10. .$I basics_quicksort_cmp.inc}
  11. --------------------------
  12. ! if COMPARABLE defined:
  13. . _QSDataType should be any type which can be compared with "<" operation
  14. ! if COMPUTABLE defined the following function should be defined:
  15. .function _QSGetValue(const V: _QSDataType): _QSValueType;
  16. .begin
  17. .  result := <some numeric expression>;
  18. .end;
  19. ! not COMPARABLE nor COMPUTABLE defined the following function should be defined:
  20. .function _QSCompare(const V1,V2: _QSDataType): <Some numeric type>;
  21. .begin
  22. .  result := V1-V2;         // As usual
  23. .end;
  24. *)
  25. {$DEFINE ForCodeNavigationWork}
  26. const MinStack = 64;
  27. var
  28.   i, j, L, R: Integer;
  29.   Temp, Temp2: _QSDataType;
  30.   StackPTR: Integer;
  31.   StackSize: Integer;
  32.   Stack: array[0..MinStack-1] of record
  33.     l, r: Integer;
  34.   end;
  35. {$IFDEF COMPUTABLE}
  36.   TempValue: _QSValueType;
  37. {$ENDIF}
  38. begin
  39.   if N < 2 then Exit;
  40.   StackSize := MinStack;
  41. //  SetLength(Stack, StackSize);
  42.   StackPTR := 0; Stack[0].l := 0; Stack[0].r := N-1;
  43.   repeat
  44.     L := Stack[StackPTR].l;
  45.     R := Stack[StackPTR].r;
  46.     Dec(StackPTR);
  47.     repeat
  48.       i := L; j := R;
  49.       Temp2 := Values[(L + R) shr 1];
  50.       repeat
  51. {$IFNDEF DESCENDING}
  52.   {$IFDEF COMPARABLE}
  53.         while Values[i] < Temp2 do Inc(i);
  54.         while Temp2 < Values[j] do Dec(j);
  55.   {$ELSE}
  56.     {$IFDEF COMPUTABLE}
  57.         TempValue := _QSGetValue(Temp2);
  58.         while _QSGetValue(Values[i]) < TempValue do Inc(i);
  59.         while TempValue < _QSGetValue(Values[j]) do Dec(j);
  60.     {$ELSE}
  61.         while _QSCompare(Values[i], Temp2) < 0 do Inc(i);
  62.         while _QSCompare(Temp2, Values[j]) < 0 do Dec(j);
  63.     {$ENDIF}
  64.   {$ENDIF}
  65. {$ELSE}
  66.   {$IFDEF COMPARABLE}
  67.         while Temp2 < Values[i] do Inc(i);
  68.         while Values[j] < Temp2 do Dec(j);
  69.   {$ELSE}
  70.     {$IFDEF COMPUTABLE}
  71.         TempValue := _QSGetValue(Temp2);
  72.         while TempValue < _QSGetValue(Values[i]) do Inc(i);
  73.         while _QSGetValue(Values[j]) < TempValue do Dec(j);
  74.     {$ELSE}
  75.         while _QSCompare(Temp2, Values[i]) < 0 do Inc(i);
  76.         while _QSCompare(Values[j], Temp2) < 0 do Dec(j);
  77.     {$ENDIF}
  78.   {$ENDIF}
  79. {$ENDIF}
  80.         if i <= j then begin
  81.           Temp := Values[i];
  82.           Values[i] := Values[j];
  83.           Values[j] := Temp;
  84.           Inc(i); Dec(j);
  85.         end;
  86.       until i > j;
  87.       if i < R then begin
  88.         Inc(StackPTR);
  89.         if StackPTR >= StackSize then begin
  90.           Inc(StackSize, MinStack);
  91. //          SetLength(Stack, StackSize);
  92.         end;
  93.         Stack[StackPTR].l := i;
  94.         Stack[StackPTR].r := R;
  95.       end;
  96.       R := j;
  97.     until L >= R;
  98.   until StackPTR < 0;
  99. //  Stack := nil;
  100. end;