Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Semrush - keyword research tool

Turn ChatGPT, Claude, Gemini, And CoPilot Into Your Personal Assistant, Business Coach, Content Creator, And More

AFFILIATE MARKETING Your all-in-one performance engine Manage affiliates, creators, and customer referrals in one unified platform—turning every partnership into measurable growth
Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

42,690 questions

55,449 answers

573 users

How to create a sorted unique array from a matrix in Pascal

1 Answer

0 votes
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

*)

 



answered May 7 by avibootz
...