Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure __TSA_LH_MBU(var TSA, tmp: TStringArray; const Lo, Mid, Hi: Integer);
- var
- L, R, i: Integer;
- begin
- L := Lo;
- R := (Mid + 1);
- for i := Lo to Hi do
- tmp[i] := TSA[i];
- for i := Lo to Hi do
- if (L > Mid) then
- begin
- TSA[i] := tmp[R];
- Inc(R);
- end else
- if (R > Hi) then
- begin
- TSA[i] := tmp[L];
- Inc(L);
- end else
- if (tmp[R] < tmp[L]) then
- begin
- TSA[i] := tmp[R];
- Inc(R);
- end else
- begin
- TSA[i] := tmp[L];
- Inc(L);
- end;
- end;
- procedure __TSA_HL_MBU(var TSA, tmp: TStringArray; const Lo, Mid, Hi: Integer);
- var
- L, R, i: Integer;
- begin
- L := Lo;
- R := (Mid + 1);
- for i := Lo to Hi do
- tmp[i] := TSA[i];
- for i := Lo to Hi do
- if (L > Mid) then
- begin
- TSA[i] := tmp[R];
- Inc(R);
- end else
- if (R > Hi) then
- begin
- TSA[i] := tmp[L];
- Inc(L);
- end else
- if (tmp[R] > tmp[L]) then
- begin
- TSA[i] := tmp[R];
- Inc(R);
- end else
- begin
- TSA[i] := tmp[L];
- Inc(L);
- end;
- end;
- procedure TSAMergeSortBU(var TSA: TStringArray; order: (so_LowToHigh, so_HighToLow));
- var
- l, s, Lo: Integer;
- tmp: TStringArray;
- begin
- l := Length(TSA);
- if (l > 1) then
- begin
- SetLength(tmp, l);
- s := 1;
- case order of
- so_LowToHigh:
- while (s < l) do
- begin
- Lo := 0;
- while (Lo < (l - s)) do
- begin
- __TSA_LH_MBU(TSA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
- Lo := (Lo + (s * 2));
- end;
- s := (s + s);
- end;
- so_HighToLow:
- while (s < l) do
- begin
- Lo := 0;
- while (Lo < (l - s)) do
- begin
- __TSA_HL_MBU(TSA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
- Lo := (Lo + (s * 2));
- end;
- s := (s + s);
- end;
- end;
- end;
- end;
- var
- TSA: TStringArray;
- begin
- TSA := ['Apple', 'Orange', 'Lemon', 'Banana', 'Pear'];
- TSAMergeSortBU(TSA, so_HighToLow); // Reversed.
- WriteLn(ToStr(TSA));
- TSAMergeSortBU(TSA, so_LowToHigh); // Default.
- WriteLn(ToStr(TSA));
- end.
Advertisement
Add Comment
Please, Sign In to add comment