Я хочу добавить возможность обработки полей из «Книги по языку программирования C упражнение 5-17»

#c #sorting

#c #сортировка

Вопрос:

В этом упражнении нам предлагается включить возможность обработки полей в программу сортировки строк (т.Е. ‘-2df -1n’ сортирует 2-й столбец по буквам, затем сортирует 1-й столбец по номерам), дело в том, что я не знаю, как реализовать сортировку для следующего флага, позвольте мне объяснить:

 ---Names--- ---Last names--- ---Ages---
   Will          Smith           25
   Samuel        Johns           16
   Enrico        Pucci           39
   Lisa          Donald          16
  

И давайте предположим, что я хочу отсортировать его с помощью -3n (возрастов), мы получим :

 ---Names--- ---Last names--- ---Ages---
   Enrico        Pucci           39
   Will          Smith           25
   Samuel        Johns           16
   Lisa          Donald          16
  

Затем я хочу отсортировать по -1df (имена), и я хочу получить :

 ---Names--- ---Last names--- ---Ages---
   Enrico        Pucci           39
   Will          Smith           25
   Lisa          Donald          16
   Samuel        Johns           16
  

(Лиза и Сэмюэль меняются местами, потому что L стоит перед S)
Проблема в том, что я просто хочу поменять местами элементы с одинаковым значением -3n , что означает, что если Энрико и Уилл были отсортированы не по имени, А по возрасту, мы не будем их трогать, а поскольку у Лизы и Сэмюэля одинаковый возраст, мы можем отсортировать их имена…

Это используемые функции сортировки и сравнения:

 void myqsort(void *lineptr[], int start, int end, int index, int (*comp)(void *, void *))
{
    // 'latest' holds the latest index where a swap happened
    int latest, i;
    if (start >= end)
        return;
    swap(lineptr, start, (start   end) / 2); // swap the first and middle element
    latest = start;
    for (i = start   1; i <= end; i  ) {
        // compare the splits of each string, so that it can handle fields
        if ((*comp)(strsplit(lineptr[i], 't')[index], strsplit(lineptr[start], 't')[index]) < 0)
            swap(lineptr, i,   latest);
    }
    swap(lineptr, start, latest);
    myqsort(lineptr, start, latest - 1, index, comp);
    myqsort(lineptr, latest   1, end, index, comp);
}
  

Объяснение кода :
Эта функция будет сортировать строки с использованием алгоритма быстрой сортировки, я мог бы изменить способ ее работы, потому strsplit(lineptr[i], 't')[index] что разве это не красиво, то, что она делает, это разбивает строку на каждую 't' и переходит к разделению индекса, где index = число во флаге (-3df = 3)

 int mystrcmp(char *s, char *t)
{
    // NOTE: dir_order and fold are external variables
    // which are set to true if we get their flag (-3d)
    char a, b;
    do {
        if (dir_order) {
            while (!isblank(*s) amp;amp; !isalnum(*s))
                s  ;
            while (!isblank(*t) amp;amp; !isalnum(*t))
                t  ;
        }
        a = (fold) ? tolower(*s) : *s;
        b = (fold) ? tolower(*t) : *t;
        s  , t  ;
    } while (a == b);
    return a - b;
}
  

Я надеюсь, что вы сможете мне помочь и что я предоставил достаточно информации, код довольно длинный, поэтому я не включил его здесь, если вы этого хотите, просто скажите мне!

Комментарии:

1. Как вы выполняете саму сортировку — передавая функцию сравнения в qsort? Вам нужно улучшить свой компаратор, чтобы разделить связи, используя следующее правило в списке. Возможно, стоит показать нам код сортировки и сравнения.

2. Спасибо. В строке сравнения разделений if ((*comp)(strsplit( вам также нужно будет проверить, равен ли результат 0, и если это так, то вам нужно будет снова сравнить разбиения для следующего столбца в порядке.