#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*
We want to sort characters in this strict order:
1. lowercase letters (a–z)
2. uppercase letters (A–Z)
3. odd digits (1,3,5,7,9)
4. even digits (0,2,4,6,8)
Strategy:
---------
We assign each character a "category rank" and sort by:
(category rank, natural character order)
This keeps the algorithm efficient and simple.
*/
/// Returns category rank for sorting.
/// Lower rank = comes earlier.
int category(char c) {
if (c >= 'a' && c <= 'z') return 0; // lowercase
if (c >= 'A' && c <= 'Z') return 1; // uppercase
if (isdigit((unsigned char)c)) {
int d = c - '0';
return (d % 2 == 1) ? 2 : 3; // odd digits → 2, even digits → 3
}
return 4; // fallback (should not happen for alphanumeric input)
}
/// Comparator for qsort
int compareChars(const void *a, const void *b) {
char ca = *(const char *)a;
char cb = *(const char *)b;
int ra = category(ca);
int rb = category(cb);
if (ra != rb)
return ra - rb; // sort by category first
return (ca - cb); // tie-breaker: natural order
}
int main(void) {
char s[] = "a2B3cD8f1Z0";
/* qsort requires:
- pointer to array
- number of elements
- size of each element
- comparator function
*/
qsort(s, sizeof(s) - 1, sizeof(char), compareChars);
printf("Sorted result: %s\n", s);
return 0;
}
/*
run:
Sorted result: acfBDZ13028
*/