unit UMergeSort; interface type TDirection = (dSourceSource, dSourceTemp, dTempTemp, dTempSource); TCompareProc = function(TempIndex, SourceIndex: integer): boolean; cdecl; PCompareProc = ^TCompareProc; TCopyProc = function(iSourceIndex, iDestIndex: integer; bDirection: TDirection): boolean; cdecl; PCopyProc = ^TCopyProc; TMergeSorter = class private n: integer; aCallbackCompare: TCompareProc; aCallbackCopy: TCopyProc; procedure MergeSort(lo, hi: integer); procedure Merge(lo, m, hi: integer); public procedure Sort(n: integer; aCompare: TCompareProc; aCopy: TCopyProc); end; implementation procedure TMergeSorter.Sort(n: integer; aCompare: TCompareProc; aCopy: TCopyProc); begin Self.n := n; Self.aCallbackCompare := aCompare; Self.aCallbackCopy := aCopy; MergeSort(0, n-1); end; procedure TMergeSorter.MergeSort(lo, hi: integer); var m: integer; begin if (lo