Как применить основную сортировку (использует сортировку с подсчетом) со структурой, содержащей несколько строк - PullRequest
1 голос
/ 05 марта 2020

Я хочу отсортировать строки по алфавиту с сортировкой по основанию, однако я пытаюсь применить сортировку по основанию, чтобы проверить каждую ди git строк. Я проверил другие сообщения, но я не мог найти структуру, похожую на мою. Проблема в том, что мой код проверяет для каждого ВХОДА структуры, а не КАЖДОЙ ди git строки в этой записи. (Под записью я подразумеваю; table [0], table [1] et c.) Таким образом, в основном она сортирует строку в каждой записи. Я не мог построить логику c, может кто-нибудь помочь мне, пожалуйста?

РЕДАКТИРОВАТЬ: длина строк не совпадают

Вот мой код:

typedef struct FUNCTIONS_STRUCT
{
    char *fncName;
    void (*fnc)(char *);
    char *description;
} FUNCTIONS_STRUCT_t;

FUNCTIONS_STRUCT_t FUNC_TABLE[] =
{

        { "ABCD", ABCD, "" },
        { "abcD", abcD, "" },
        { "EaBB", EaBB ,""}
        //it goes on ..

};

// Function to find the Largest Number
int getMax(int array[], int n) {
  int max = array[0];
  int i;
  for (i = 1; i < n; i++)
    if (array[i] > max)
      max = array[i];
  return max;
}
// Function for Count sort
void countSort(int array[], int n, int dig) {
  int output[n];
  int i, count[10] = {0};

  for (i = 0; i < n; i++)
    count[(array[i] / dig) % 10]++;

  for (i = 1; i < 10; i++)
    count[i] += count[i - 1];

  for (i = n - 1; i >= 0; i--){
    output[count[(array[i] / dig) % 10] - 1] = array[i];
    count[(array[i] / dig) % 10]--;
  }

  for (i = 0; i < n; i++)
    array[i] = output[i];

}

void radixsort(int array[], int n) {
  //Get the largest number to know the maximum number of digits
  int m = getMax(array, n);
  int dig;

  //Counting sort is performed for every digit
  for (dig = 1; m / dig > 0; dig *= 10)
    countSort(array, n, dig);
}

int main()
{
    int functionTableUnitSize = sizeof(FUNC_TABLE) / sizeof(FUNC_TABLE[0]);
    radixsort(&FUNC_TABLE, functionTableUnitSize);
    return 0;
}

1 Ответ

1 голос
/ 06 марта 2020

Я предполагаю, что имена функций в вашем вопросе имеют одинаковую длину 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...