How to rank elements of an integer array based on their sorted order in C

1 Answer

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

/*
    FUNCTION: printArray
    ---------------------
    Prints the contents of an integer array.
*/
void printArray(int arr[], int size) {
    printf("Array: [ ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("]\n");
}

/*
    FUNCTION: copyArray
    ---------------------
    Creates a copy of an integer array.
*/
void copyArray(int dest[], int src[], int size) {
    for (int i = 0; i < size; i++) {
        dest[i] = src[i];
    }
}

/*
    FUNCTION: sortArray
    ---------------------
    Sorts an integer array in ascending order using qsort.
*/
int compareInts(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

void sortArray(int arr[], int size) {
    qsort(arr, size, sizeof(int), compareInts);
}

/*
    FUNCTION: buildRankArray
    -------------------------
    Builds an array of ranks based on sorted order.

    Ranking rules:
    - Lowest value gets rank 1
    - Equal values share the same rank
    - Rank increases only when encountering a new unique value
*/
void buildRankArray(int sorted[], int size, int rankMap[]) {

    int rank = 1;
    rankMap[0] = rank;

    for (int i = 1; i < size; i++) {
        if (sorted[i] != sorted[i - 1]) {
            rank++;
        }
        rankMap[i] = rank;
    }
}

/*
    FUNCTION: applyRanks
    ---------------------
    Converts the original array into ranks based on sorted order.
*/
void applyRanks(int original[], int sorted[], int rankMap[], int ranked[], int size) {

    for (int i = 0; i < size; i++) {
        // Find original[i] in sorted[] and use its rank
        for (int j = 0; j < size; j++) {
            if (original[i] == sorted[j]) {
                ranked[i] = rankMap[j];
                break;
            }
        }
    }
}

/*
    FUNCTION: rankArray
    ---------------------
    Main ranking workflow:
    1. Print original array
    2. Copy array
    3. Sort the copy
    4. Build rank array
    5. Apply ranks to original order
*/
void rankArray(int arr[], int size) {

    printArray(arr, size);

    int arrCopy[size];
    int sorted[size];
    int rankMap[size];
    int ranked[size];

    // Step 1: Copy array
    copyArray(arrCopy, arr, size);

    // Step 2: Sort the copy
    copyArray(sorted, arrCopy, size);
    sortArray(sorted, size);

    // Step 3: Build rank map
    buildRankArray(sorted, size, rankMap);

    // Step 4: Apply ranks to original order
    applyRanks(arr, sorted, rankMap, ranked, size);

    printf("Rank:   [ ");
    for (int i = 0; i < size; i++) {
        printf("%d ", ranked[i]);
    }
    printf("]\n");
}

/*
    MAIN PROGRAM
*/
int main() {

    int arr[] = {33, 99, 10, 25, 47, 11, 77};
    int size = sizeof(arr) / sizeof(arr[0]);

    rankArray(arr, size);

    return 0;
}


/*
run:

Array: [ 33 99 10 25 47 11 77 ]
Rank:   [ 4 7 1 3 5 2 6 ]

*/

 



answered 1 day ago by avibootz

Related questions

...