program SortedUniquearrFromMatrix;
{$mode objfpc}
(*
Create a sorted unique array (arr) from a matrix (arr of arr).
Steps:
1. Flatten matrix into array
2. Sort array (QuickSort)
3. Remove duplicates in-place
*)
const
ROWS = 3;
COLS = 8;
type
TArr = array[0..COLS-1] of Integer;
TMat = array[0..ROWS-1] of TArr;
TArrResult = array of Integer;
procedure QuickSort(var arr: TArrResult; L, R: Integer);
var
i, j, pivot, tmp: Integer;
begin
i := L;
j := R;
pivot := arr[(L + R) div 2];
repeat
while arr[i] < pivot do Inc(i);
while arr[j] > pivot do Dec(j);
if i <= j then
begin
tmp := arr[i];
arr[i] := arr[j];
arr[j] := tmp;
Inc(i);
Dec(j);
end;
until i > j;
if L < j then QuickSort(arr, L, j);
if i < R then QuickSort(arr, i, R);
end;
function MakeSortedUniqueArr(const mat: TMat): TArrResult;
var
r, c, k, u: Integer;
begin
SetLength(Result, ROWS * COLS);
// Flatten matrix into arr
k := 0;
for r := 0 to ROWS - 1 do
for c := 0 to COLS - 1 do
begin
Result[k] := mat[r][c];
Inc(k);
end;
QuickSort(Result, 0, High(Result));
// Remove duplicates in-place
u := 0;
for k := 0 to High(Result) do
begin
if (k = 0) or (Result[k] <> Result[k - 1]) then
begin
Result[u] := Result[k];
Inc(u);
end;
end;
SetLength(Result, u);
end;
var
mat: TMat = (
(5, 1, 17, 3, 8, 2, 1, 9),
(3, 5, 7, 4, 2, 3, 4, 1),
(9, 1, 8, 2, 3, 88, 17, 5)
);
arr: TArrResult;
i: Integer;
begin
arr := MakeSortedUniqueArr(mat);
for i := 0 to High(arr) do
Write(arr[i], ' ');
end.
(*
run:
1 2 3 4 5 7 8 9 17 88
*)