Тестирование алгоритмов сортировки с разными размерами наборов чисел

У меня есть код C, который сначала реализует алгоритм пузырьковой сортировки, а затем AVL Сортировка для разных размеров наборов чисел. У меня есть 4 разных файла .txt, которые включают разные размеры наборов чисел (10000 - 100000 - 1000000 - 10000000). Когда я пробую оба алгоритма с большим количеством маленьких наборов чисел или даже пробую их только с одним набором чисел, оба алгоритма работают нормально и дают истинные результаты. Но когда я вызываю их последовательно в функции main, программа консоли прерывается и перестает работать. Вот мои вызовы в основной функции;

int main()
{

    test("10000.txt", 10000);
    test("100000.txt", 100000);
    test("1000000.txt", 1000000);
    test("10000000.txt", 10000000);


    return 0;
}

Здесь то, что делает функция test(), - это чтение всех строк из файлов .текст и их вставка в AVL Tree и в несортированный массив. Затем работают алгоритмы AVL Сортировка и Пузырьковая сортировка, прошедшее время записывается и выводится на консоль. Несмотря на то, что я комментирую коды AVL-сортировки и запускаю только пузырьковую сортировку, она прерывается, когда я последовательно вызываю функцию test() в основном. Вот моя функция пузырьковой сортировки;

void bubblesort(unsigned long long *arr, int n)
{

    int i, j;
    unsigned long long temp = 0;

    for(i = 0; i<n; i++)
    {

       for(j = 0; j<n-i-1; j++)
       {

            if ( arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }

}

Это консольный вывод, когда я последовательно вызываю test (), так как вы можете видеть только первый файл .txt с 10000 протестированными элементами, а затем программа была прервана;

Тестирование алгоритмов сортировки с разными размерами наборов чисел

Итак, есть ли кто-нибудь, кто может объяснить мне, в чем проблема? Спасибо за помощь.

Обновлено: для тех, кто хотел, чтобы я поделился функцией test (), я удалил строки о дереве AVL и упростил его, показав только часть пузырьковой сортировки. Это просто не сокрушает, когда пузырьковая сортировка одна, она сортирует 10.000 элементов за 0 секунд, 100000 элементов за 44 секунды, но когда дело доходит до 1.000.000 элементов, он просто ждет слишком долго, может быть, более 10 минут, но все же может Выхода не даю. Это нормально для пузырьковой сортировки тратить слишком много времени на сортировку такого количества элементов?

void test(char *fname, int n)
{
    time_t start, end;
    FILE *fp;
    int i = 0;
    unsigned long long number;
    unsigned long long *unsorted = (unsigned long long  *)malloc(sizeof(unsigned long long)*n);

    fp = fopen(fname, "r+");
    for(i = 0; i<n; i++)
    {
        fscanf(fp, "%llu\n", &number);
        unsorted[i] = number;
    }
    fclose(fp);

    time(&start);
    bubblesort(unsorted, n);
    time(&end);
    printf("bubblesort function's time spent is %ld second for %d number of elements.\n", (end - start), n);
    free(unsorted);    
}

Вы забыли опубликовать код функции test().

mnistic 01.12.2018 22:21

Это действительно длинный код, я могу поделиться им?

Ozan Yurtsever 01.12.2018 22:23

Как вы создаете массивы? Если вы используете VLA (массив переменной длины), вы, вероятно, взорвали свой стек. Если вы используете malloc() и др., Все будет в порядке; если вы используете глобальную переменную или даже статическую переменную в функции, все должно быть в порядке (по крайней мере, в этом отношении).

Jonathan Leffler 01.12.2018 22:23

@OzanYurtsever Если он действительно длинный, попробуйте сократить его до минимума кода, в котором все еще есть проблема.

mnistic 01.12.2018 22:24

Прочтите, как создать MCVE (минимальный воспроизводимый пример), где «полная» так же важна, как и «минимальная». Обычно это означает изменение (копию) вашей программы, иногда довольно серьезно. Но да, вы должны показать достаточно кода, чтобы облегчить воспроизведение вашей проблемы. Не очевидно, что проблема в функции, которую вы показываете. Например, можно ли обойтись без сортировки дерева AVL, если вы считаете, что проблема в пузырьковой сортировке, или наоборот?

Jonathan Leffler 01.12.2018 22:25

@mnistic, я выложил его полную форму, сейчас попробую сократить.

Ozan Yurtsever 01.12.2018 22:25

Почему вы открываете файл в режиме обновления? Вы ведь не записываете результаты во входной файл?

Jonathan Leffler 01.12.2018 22:27

@Jonathan Leffler, нет, отсортированные результаты хранятся только в массивах и даже не печатаются. Для файлов .txt обновлений нет, они останутся прежними. Основная цель - вычислить время сортировки и сравнить их.

Ozan Yurtsever 01.12.2018 22:30

Текущий код не компилируется (отсутствует определение number). Перед обновлением проверьте и убедитесь, что проблема с кодом не устранена.

mnistic 01.12.2018 22:35

@mnistic, Когда я упростил функцию, то по ошибке удалил некоторые необходимые объявления переменных. Теперь я исправил это

Ozan Yurtsever 01.12.2018 22:38

Вы действительно тестировали упрощенную функцию? Он все еще рушится?

mnistic 01.12.2018 22:43

@mnistic Добавляет проверки после mallocing и fopen.

kiran Biradar 01.12.2018 22:44

@mnistic, на самом деле, когда я попробовал еще раз, он просто не давит, когда пузырьковая сортировка одна, сортирует 10.000 элементов за 0 секунд, 100000 элементов за 44 секунды, но когда дело доходит до 1.000.000 элементов, он просто тоже ждет долго, может быть, более 10 минут, но все равно не может дать никакого результата. Это нормально для пузырьковой сортировки тратить слишком много времени на сортировку такого количества элементов?

Ozan Yurtsever 01.12.2018 22:49

Когда я использую код, кажется, что он работает. На 10000 случайных чисел требуется меньше секунды; на 100 000 случайных чисел потребовалось около 17 секунд. Я все еще использую сортировку 1 000 000 - это, вероятно, займет около получаса. Я не буду рассчитывать время сортировки 10M; это слишком долго. (Использование GCC 8.2.0 на MacBook Pro под управлением macOS 10.14.1 Mojave.) Итак, как и раньше, проблема явно не в коде, который вы показываете. Обратите внимание, что пузырьковая сортировка - это алгоритм O (N²), поэтому, когда вы умножаете ввод на 10, его выполнение занимает примерно в 100 раз больше времени.

Jonathan Leffler 01.12.2018 22:50

@OzanYurtsever Да, пузырьковая сортировка ужасная: vinayakgarg.wordpress.com/2011/10/25/…

mnistic 01.12.2018 22:52

@JonathanLeffler, мне кажется, я понимаю, в чем я ошибаюсь. Я не освобождаю свое дерево после тестирования одного файла .txt.

Ozan Yurtsever 01.12.2018 22:52

Спасибо всем, я собираюсь написать функцию, чтобы освободить свое дерево, и поделюсь результатами отсюда.

Ozan Yurtsever 01.12.2018 22:53

В ПОРЯДКЕ; это, вероятно, объяснило бы это. Дерево будет занимать значительно больше места, чем массив. Это также демонстрирует, что вы должны ошибаться при проверке операций открытия файлов и операций выделения памяти.

Jonathan Leffler 01.12.2018 22:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
18
291
0

Другие вопросы по теме