#include <stdio.h>
#include <stdlib.h>
#define ROWS 3
#define COLS 8
/*
Create a sorted unique array (arr) from a matrix mat[ROWS][COLS].
Steps:
1. Flatten matrix into arr
2. Sort arr (qsort)
3. Remove duplicates in-place
*/
// Comparison function for qsort
int cmp_int(const void *a, const void *b) {
int x = *(const int*)a;
int y = *(const int*)b;
return (x > y) - (x < y);
}
// Flatten + sort + unique
int* make_sorted_unique_arr(int mat[][COLS], int rows, int cols, int *out_size) {
int total = rows * cols;
int *arr = malloc(total * sizeof(int));
if (!arr) return NULL;
// Flatten matrix into arr
int k = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
arr[k++] = mat[r][c];
}
}
// Sort arr
qsort(arr, total, sizeof(int), cmp_int);
// Remove duplicates in-place
int u = 0;
for (int i = 0; i < total; i++) {
if (i == 0 || arr[i] != arr[i - 1]) {
arr[u++] = arr[i];
}
}
*out_size = u;
return arr;
}
int main() {
// Matrix declared as matrix[][COLS]
int mat[ROWS][COLS] = {
{5, 1, 17, 3, 8, 2, 1, 9},
{3, 5, 7, 4, 2, 3, 4, 1},
{9, 1, 8, 2, 3, 88, 17, 5}
};
int out_size = 0;
int *arr = make_sorted_unique_arr(mat, ROWS, COLS, &out_size);
for (int i = 0; i < out_size; i++) {
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
/*
run:
1 2 3 4 5 7 8 9 17 88
*/