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

游戏引擎

开发平台:

Delphi

  1. (*
  2.  Quicksort algorithm template (indexed data)
  3. Usage:
  4. --------------------------
  5. .type _QSDataType = <Your type>; [_QSValueType = <any comparable type>]
  6. .[<_QSGetValue or _QSCompare function body>]
  7. .[$DEFINE COMPARABLE | COMPUTABLE]
  8. .$I basics_quicksort_cmp.inc}
  9. --------------------------
  10. ! if COMPARABLE defined:
  11. . _QSDataType should be any type which can be compared with "<" operation
  12. ! if COMPUTABLE defined the following function should be defined:
  13. .function _QSGetValue(const V: _QSDataType): _QSValueType;
  14. .begin
  15. .  result := <some numeric expression>;
  16. .end;
  17. ! not COMPARABLE nor COMPUTABLE defined the following function should be defined:
  18. .function _QSCompare(const V1,V2: _QSDataType): <Some numeric type>;
  19. .begin
  20. .  result := V1-V2;         // As usual
  21. .end;
  22. *)const MinStack = 64;
  23. {$DEFINE ForCodeNavigationWork}
  24. var
  25.   i, j, L, R, Temp: Integer;
  26.   Temp2: _QSDataType;
  27.   StackPTR: Integer;
  28.   StackSize: Integer;
  29.   Stack: array[0..MinStack-1] of record
  30.     l, r: Integer;
  31.   end;
  32. begin
  33.   for i := 0 to N-1 do Inds[i] := i;
  34.   if N < 2 then Exit;
  35.   StackSize := MinStack;
  36. //  SetLength(Stack, StackSize);
  37.   StackPTR := 0; Stack[0].l := 0; Stack[0].r := N-1;
  38.   repeat
  39.     L := Stack[StackPTR].l;
  40.     R := Stack[StackPTR].r;
  41.     Dec(StackPTR);
  42.     repeat
  43.       i := L; j := R;
  44.       Temp2 := Values[Inds[(L + R) shr 1]];
  45.       repeat
  46.         if Acc then begin
  47.           while Temp2 > Values[Inds[i]] do Inc(i);
  48.           while Temp2 < Values[Inds[j]] do Dec(j);
  49.         end else begin
  50.           while Temp2 < Values[Inds[i]] do Inc(i);
  51.           while Temp2 > Values[Inds[j]] do Dec(j);
  52.         end;
  53.         if i <= j then begin
  54.           Temp := Inds[i];
  55.           Inds[i] := Inds[j];
  56.           Inds[j] := Temp;
  57.           Inc(i); Dec(j);
  58.         end;
  59.       until i > j;
  60.       if i < R then begin
  61.         Inc(StackPTR);
  62.         if StackPTR >= StackSize then begin
  63.           Inc(StackSize, MinStack);
  64. //          SetLength(Stack, StackSize);
  65.         end;
  66.         Stack[StackPTR].l := i;
  67.         Stack[StackPTR].r := R;
  68.       end;
  69.       R := j;
  70.     until L >= R;
  71.   until StackPTR < 0;
  72. //  Stack := nil;
  73. end;