Функция слияния сортировки слиянием, удаляющая самую крупную в алфавитном порядке структуру записи

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