How to create a common sorted unique array from 3 integer arrays in C

1 Answer

0 votes
#include <stdio.h>
#include <stdlib.h>

/*
    Function: mergeArrays
    Purpose:  Merge three integer arrays into one dynamically allocated array.
              The caller receives the merged array and its size.
*/
int* mergeArrays(const int *a, int sizeA,
                 const int *b, int sizeB,
                 const int *c, int sizeC,
                 int *mergedSize)
{
    *mergedSize = sizeA + sizeB + sizeC;

    int *merged = (int*)malloc(*mergedSize * sizeof(int));
    if (!merged) {
        printf("Memory allocation failed\n");
        exit(1);
    }

    int index = 0;

    for (int i = 0; i < sizeA; i++) merged[index++] = a[i];
    for (int i = 0; i < sizeB; i++) merged[index++] = b[i];
    for (int i = 0; i < sizeC; i++) merged[index++] = c[i];

    return merged;
}

/*
    Function: compareInts
    Purpose:  Comparison function for qsort (ascending order).
*/
int compareInts(const void *x, const void *y) {
    return (*(int*)x - *(int*)y);
}

/*
    Function: uniqueSorted
    Purpose:  Sort an array and remove duplicates.
              Returns a new dynamically allocated array containing only unique values.
*/
int* uniqueSorted(int *arr, int size, int *uniqueSize)
{
    qsort(arr, size, sizeof(int), compareInts);

    int *unique = (int*)malloc(size * sizeof(int));
    if (!unique) {
        printf("Memory allocation failed\n");
        exit(1);
    }

    int count = 0;
    for (int i = 0; i < size; i++) {
        if (i == 0 || arr[i] != arr[i - 1]) {
            unique[count++] = arr[i];
        }
    }

    *uniqueSize = count;

    return unique;
}

int main()
{
    /* Example input arrays */
    int arr1[] = {5, 1, 14, 3, 8, 9, 1, 1, 7};
    int arr2[] = {3, 5, 7, 2, 3};
    int arr3[] = {2, 9, 8};

    int size1 = sizeof(arr1) / sizeof(arr1[0]);
    int size2 = sizeof(arr2) / sizeof(arr2[0]);
    int size3 = sizeof(arr3) / sizeof(arr3[0]);

    /* Step 1: Merge arrays */
    int mergedSize;
    int *merged = mergeArrays(arr1, size1, arr2, size2, arr3, size3, &mergedSize);

    /* Step 2: Sort and remove duplicates */
    int uniqueSize;
    int *unique = uniqueSorted(merged, mergedSize, &uniqueSize);

    /* Step 3: Print result */
    printf("Sorted unique array: ");
    for (int i = 0; i < uniqueSize; i++) {
        printf("%d ", unique[i]);
    }
    printf("\n");

    /* Cleanup */
    free(merged);
    free(unique);

    return 0;
}



/*
run:

Sorted unique array: 1 2 3 5 7 8 9 14 

*/

 



answered May 6 by avibootz

Related questions

...