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

1 Answer

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

*/

 



answered May 6 by avibootz
...