Я предполагаю, что имена функций в вашем вопросе имеют одинаковую длину 4 алфавита c символов. В C идентификаторы могут использовать 63 различных алфавитных символа c символов из этих групп:
- строчные буквы (abcdefghijklmnopqrstuvwxyz)
- строчные буквы (ABCDEFGHIJKLMNOPQRSTUVWXYZ)
- и знак подчеркивания (_)
Разные кодировки имеют разный порядок (например, EBCDI C строчные буквы сортируются перед заглавными буквами, в то время как обратное верно для ASCII). Поэтому для переносной программы C мы можем определить наш собственный лексический порядок сортировки.
Мы можем сделать это, например, с помощью функции build_lexical_sorting_index.
Подробности
- Я минимально скорректировал наименование из кода, который вы задаете в своем вопросе
- ваши функции должны работать с массивами FUNCTION и не с массивами int
- radix_sort сначала создает индекс лексической сортировки
- count_sort должен затем вызываться для каждого из 4 алфавитных символов c символов имени функции
- слова обычно сортируется по крайнему левому символу, поэтому мы делаем это следующим образом:
- count_sort затем вызывается для каждого из 4 символов
- , это определяет индекс из индекса lexical_sorting соответствующего символа из имя функции
- тогда применяется алгоритм сортировки счетчиков, как показано в вашем вопросе
- в конце выводится результат
Если кто-то немного модифицирует ваш код в соответствии с вышеупомянутые пункты, это выглядит так:
#include <stdio.h>
#define UNIFORM_FUNCNAME_LENGTH 4
typedef struct {
char *fnc_name;
void (*fnc)(char *);
char *description;
} FUNCTION;
void ABCD(char *a) {};
void abcD(char *a) {};
void EaBB(char *a) {};
void A012(char *a) {};
void _ABC(char *a) {};
FUNCTION func_table[] = {
{"ABCD", ABCD, ""},
{"abcD", abcD, ""},
{"EaBB", EaBB, ""},
{"A012", A012, ""},
{"_ABC", _ABC, ""}
//it goes on ..
};
int lexical_sorting_index[256] = {0};
int lexical_index(int ch) {
return lexical_sorting_index[ch];
}
void count_sort(FUNCTION *array, int n, int char_position) {
FUNCTION output[n];
int count[256] = {0};
for (int i = 0; i < n; i++) {
int ch = array[i].fnc_name[char_position];
int index = lexical_index(ch);
count[index]++;
}
for (int i = 1; i < 256; i++)
count[i] += count[i - 1];
for (int i = n - 1; i >= 0; i--) {
int ch = array[i].fnc_name[char_position];
int index = lexical_index(ch);
output[count[index] - 1] = array[i];
count[index]--;
}
for (int i = 0; i < n; i++)
array[i] = output[i];
}
void build_lexical_sorting_index() {
int nr = 0;
for (int i = 'a'; i <= 'z'; i++)
lexical_sorting_index[i] = nr++;
for (int i = 'A'; i <= 'Z'; i++)
lexical_sorting_index[i] = nr++;
for (int i = '0'; i <= '9'; i++)
lexical_sorting_index[i] = nr++;
lexical_sorting_index['_'] = nr;
}
void radix_sort(FUNCTION *array, int n) {
build_lexical_sorting_index();
for(int char_position = UNIFORM_FUNCNAME_LENGTH - 1; char_position >= 0; char_position--)
count_sort(array, n, char_position);
}
int main() {
int table_size = sizeof(func_table) / sizeof(func_table[0]);
radix_sort(func_table, table_size);
for (int i = 0; i < table_size; i++)
printf("%s ", func_table[i].fnc_name);
return 0;
}
Когда программа выполняется, в deb отображается следующее консоль ug:
abcD ABCD A012 EaBB _ABC