How to sort a string in the order: lowercase letters - uppercase letters - odd digits - even digits in C

1 Answer

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

*/

 



answered 14 hours ago by avibootz

Related questions

...