Функция слияния сортировки слиянием, удаляющая самую крупную в алфавитном порядке структуру записи
Функции сортировки слиянием корректно сортируются до последней итерации, в которой наибольшее алфавитное значение полностью удаляется из готового массива. Я новичок в C, и я борюсь с этим, потому что сортировка слиянием отлично работает с атрибутом OCCURRENCES структуры ENTRY, но не с массивом char WORDS при использовании strcmp.. он должен работать так же, вот код для структуры и для функций слияния и сортировки:
Вот пример моего вывода: файл содержит "Привет мир, как твои дела"
| hello | 1 |
| world | 1 |
| how | 2 |
| are | 1 |
| you | 1 |
| doing | 1 |
+-----------------------------------+
+_____________________________+
| Word | Occurrences |
+-----------------------------+
| how | 2 |
| doing | 1 |
| you | 1 |
| are | 1 |
| world | 1 |
| hello | 1 |
+-----------------------------+
+___________________________________+
| Word | Occurrences |
+-----------------------------------+
| are | 1 |
| doing | 1 |
| hello | 1 |
| how | 2 |
| world | 1 |
+-----------------------------------+
zoe@zoe-VirtualBox:~/Analysis$ ^C
1 ответ
Решение
Похоже, у вас есть ошибка копирования / вставки в вашем merge
функция. Вместо:
while(l <= high) b[i++] = a[l++];
Ты хочешь:
while(m <= high) b[i++] = a[m++];
После этого ваш код сортировки работает нормально.
Вот некоторый тестовый код. Я назвал это с:
./sortTest hello world hello rabbit dog fox hen worm world 01234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789 ant
И результат был возвращен как:
Results ...
01234567890123456789012345678901234567890123 2
ant 1
dog 1
fox 1
hello 2
hen 1
rabbit 1
world 2
worm 1
Вот тестовый код:
ENTRY *find_dup(ENTRY* entries, const char *str, int N)
{
ENTRY *dup = NULL;
int i;
for(i=0; i < N; ++i)
{
if (strncmp(entries[i].WORD, str, sizeof(entries[i].WORD)-1) == 0)
{
dup = entries + i;
break;
}
}
return dup;
}
void print_entries(const ENTRY* entries, int N)
{
int i;
for(i=0; i < N; ++i)
{
fprintf(stdout, "%s %d\n", entries[i].WORD, entries[i].OCCURRENCES);
}
}
int main(int argc, const char **argv)
{
int i, N=0;
ENTRY *entries = malloc((argc-1)*sizeof(*entries));
ENTRY *scratch = malloc((argc-1)*sizeof(*entries));
for(i=1; i < argc; ++i)
{
ENTRY *dup = find_dup(entries, argv[i], N);
if (dup == NULL)
{
strncpy(entries[N].WORD, argv[i], sizeof(entries[N].WORD));
entries[N].WORD[sizeof(entries[N].WORD)-1] = 0;
entries[N].OCCURRENCES = 1;
++N;
}
else
{
++dup->OCCURRENCES;
}
}
sort(entries, scratch, 0, N-1, 0);
fprintf(stdout, "Results ... \n");
print_entries(entries, N);
free(entries);
free(scratch);
return 0;
}