#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, и если это так, то вам нужно будет снова сравнить разбиения для следующего столбца в порядке.