#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 ]
*/