Один подход просто удваивает размер c[]
и формирует индекс, в котором все четные индексы прописные, а нечетные строчные.
#if 1
#define RANGE (255*2 + 1)
#include <ctype.h>
#define CH_TO_INDEX(ch) \
(2*toupper((unsigned char)ch) + !!islower((unsigned char) ch))
#else
// Original
#define RANGE 255
#define CH_TO_INDEX(ch) (ch)
#endif
void countingSort(char a[], char b[], int n) {
int i;
int c[RANGE + 1];
memset(c, 0, sizeof(c));
for (i = 0; i < n; i++) {
//c[a[i]] = c[a[i]] + 1;
c[CH_TO_INDEX(a[i])]++;
}
for (i = 1; i < RANGE; i++) {
c[i] = c[i] + c[i - 1];
}
for (i = n - 1; i >= 0; i--) {
// b[c[a[i]] - 1] = a[i];
b[c[CH_TO_INDEX(a[i])] - 1] = a[i];
// c[a[i]] = c[a[i]] - 1;
c[CH_TO_INDEX(a[i])]--;
}
}
Выходные данные
cbcdECaAbC
AabbCCccdE
Можно получить более сложный char --> index
, который не удваивает размер c[]
. Такие отображения имеют тенденцию делать предположения, что существуют только буквы AZ. Такое сопоставление может использовать вспомогательный массив сопоставления:
unsigned char map[256] - {
0, 1, 2, ...., 31, ' ', ... 'A', 'a', 'B', 'b', ... 'Z', 'z',
ASCII characters after 'Z' and before 'a'
ASCII characters after 'z', .... 255 };
Запрошен OP
Output : A a b b C C c c d e
Но на основании {'c', 'b', 'c', 'd', 'E', 'C', 'a', 'A', 'b', 'C'}
, я думаю, что OP хочет
Output : A a b b C C c c d E
Обратите внимание, что оригинальный код не работает, если a[i] < 0
. Код нуждается в доработке для отрицательного char
. Перекодировать с помощью unsigned char
.