Merge & Reverse.
Програма, яка з двох однаково упорядкованих масивів повертає об'єднаний упорядкований масив:
program MergeExample;
type
TArray = array of Integer;
TOrder = function(
const a: Integer;
const b: Integer
): Boolean;
function Ordered(
const a: TArray; const n: Integer;
const IsOrdered: TOrder
): Boolean;
var i: Integer;
begin
Ordered := True;
i := 1;
while Ordered and (i < n) do
begin
if not IsOrdered(a[i-1], a[i]) then
Ordered := False;
i := i + 1;
end;
end;
function Merge(
const a: TArray; const aLen: Integer;
const b: TArray; const bLen: Integer;
const IsOrdered: TOrder
): TArray;
var ai, bi, ci, cLen: Integer;
begin
ai := 0;
bi := 0;
ci := 0;
cLen := aLen + bLen;
Setlength(Merge, cLen);
while (ai < aLen) and (bi < bLen) do
begin
if IsOrdered(a[ai], b[bi]) then
begin
Merge[ci] := a[ai];
ai := ai + 1;
end
else
begin
Merge[ci] := b[bi];
bi := bi + 1;
end;
ci := ci + 1;
end;
while (ai < aLen) do
begin
Merge[ci] := a[ai];
ai := ai + 1;
ci := ci + 1;
end;
while (bi < bLen) do
begin
Merge[ci] := b[bi];
bi := bi + 1;
ci := ci + 1;
end;
end;
function Asc(
const a: Integer;
const b: Integer
): Boolean;
begin
Asc := (a <= b);
end;
function Desc(
const a: Integer;
const b: Integer
): Boolean;
begin
Desc := (a >= b);
end;
procedure PrintArray(
const a: TArray; const n: Integer
);
var i: Integer;
begin
for i := 0 to n - 1 do
write(a[i], ', ');
writeln();
end;
const n = 12; m = 11;
a: array[0 .. n - 1] of Integer = (0, 0, 1, 2, 4, 6, 6, 6, 7, 8, 9, 9);
b: array[0 .. m - 1] of Integer = (0, 1, 2, 2, 3, 5, 7, 7, 8, 8, 8);
{
a: array[0 .. n - 1] of Integer = (9, 7, 6, 5, 4, 3, 3, 2, 2, 2, 1, 0);
b: array[0 .. m - 1] of Integer = (9, 7, 6, 5, 5, 5, 4, 1, 1, 1, 0);
}
var c: TArray;
aAsc, bAsc, aDesc, bDesc: Boolean;
begin
PrintArray(a, n);
PrintArray(b, m);
aAsc := Ordered(a, n, @Asc);
bAsc := Ordered(b, m, @Asc);
aDesc := Ordered(a, n, @Desc);
bDesc := Ordered(b, m, @Desc);
if not aAsc and not aDesc then
begin
writeln('Array a is not ordered.');
Exit();
end;
if not bAsc and not bDesc then
begin
writeln('Array b is not ordered.');
Exit();
end;
if (aAsc and bDesc) or (aDesc and bAsc) then
begin
writeln('Arrays a and b has different orders.');
Exit();
end;
if not aDesc and not bDesc then c := Merge(a, n, b, m, @Asc) else
if not aAsc and not bAsc then c := Merge(a, n, b, m, @Desc);
PrintArray(c, n + m);
end.
В даному прикладі порядок масиву-результату такий самий як в масивів-параметрів.
Якщо розберете (зрозумієте) цей приклад, то не буде проблемою вирішити початкову задачу.
То вже занадто.