Язык Си: лаба по сортировке


Продолжаем курс cs50, неделя третья, алгоритмы сортировки. Настало время лабораторки. Она очень простая:

  • скачать тестовый сетап: https://cdn.cs50.net/2021/fall/labs/3/sort.zip
  • внутри архива лежат три уже скомпилированные программы на C: sort1, sort2 и sort3 — это бинарники, т.е. файлы с двоичным кодом, поэтому мы не можем просмотреть их исходный код на C.
  • каждая из этих программ работает по одному из алгоритмов сортировки: сортировка выбором (selection sort), пузырьковая сортировка (bubble sort) или сортировка слиянием (merge sort). В каком файле какая — мы не знаем. Наша задача — определить, какой алгоритм сортировки используется в каждом бинарнике.

В этой задаче нужно понять, какая программа использует какой алгоритм, и сделать это нужно не смотря на сам код программы, так как его не видно, а только по времени выполнения сортировки разных массивов данных. Для этого нам дают несколько файлов .txt, в которых приведены числа — есть три типа файлов:

  1. уже отсортированные правильно;
  2. рандомные (случайный порядок);
  3. отсортированные в обратном порядке.

В файлах есть от 5 до 50 тысяч значений, и мы можем запускать каждую из трех программ для каждого из этих 9 файлов с числами, запуск программы сортировки идет через командную строку: ./[имя_программы] [текстовый_файл.txt]

Например, запуск может выглядеть так:
./sort1 reversed50000.txt.

Чтобы узнать, сколько времени потребуется программе для сортировки, запускаем таймер через терминал:
time ./[имя_программы] [текстовый_файл.txt].

Записываем себе значение real time, и используем эти данные для анализа алгоритмов. Чтобы сдать лабораторную работу, нужно заполнить текстовый файл answer.txt — написать какая программа использует какой алгоритм и объяснить, на основании чего вы сделали такой вывод. Здесь не нужно писать сам код алгоритмов или вообще что-либо программировать. Задача сводится к анализу и логическому поиску ответа.

Штукенция

Чтобы выполнить эту лабораторную работу, я нарисовала табличку и заполнила ее данными:

Так как никаких данных, кроме времени выполнения сортировки у нас нет, то нужно смотреть на время и аналитически догадаться, где какой алгоритм. Учитывая, что у разных алгоритмов разное минимальное и максимальное время, я первоначально сосредоточилась на сравнении данных из первой колонки (reversed) и последней колонки (sorted): это наш худший и лучший случаи. Худший, так как все данные отсортированы наоборот. И лучший, так как все числа и так в нужном порядке.

Сначала я нашла те два алгоритма, где худшие и лучшие случаи мало отличаются, так как время их выполнения близко (selection и merge), затем из я нашла алгоритм, который при росте количества обратно отсортированного массива становится заметно медленнее (bubble). Далее, как отличить selection от merge? Merge при увеличении количества данных сортирует быстрее, чем select. В конце концов я сравнила, как в целом ведет себя алгоритм, даже если числа рандомные. В итоге сначала я обнаружила bubble, а затем из двух оставшихся выделила merge.

sort1 uses: bubble sort

How do you know?: reversed and sorted speed soring is different (as n^2 and n) and for the biggest random list it is the slowest

sort2 uses: merge sort

How do you know?: it has the same or close sorting speed for best and worst cases and it much faster than 3rd (as nlogn)

sort3 uses: selection sort

How do you know?: it has the same or close sorting speed for reversed and sorted lists, but it become slower with growing of numbers (as n^2)

Игроглаз

Ну а я воспользовался не менее архаичным способом — блокнотом 🙂 Получились следующие результаты:

sort 1 - slowest on random and reversed, but good at sorted
bubble sort

random 5000     .092
random 10000    .254
random 50000   8.145

reversed 5000   .089
reversed 10000  .285
reversed 50000 6.362

sorted 5000     .027
sorted 10000    .087
sorted 50000    .552

--

sort 2 - faster than any other for all types of data
merge sort

random 5000     .041
random 10000    .266
random 50000    .486

reversed 5000   .038
reversed 10000  .083
reversed 50000  .562

sorted 5000     .044
sorted 10000    .069
sorted 50000    .506

--

sort 3 - equal on any type of data
selection sort
random 5000     .070
random 10000    .179
random 50000    3.790

reversed 5000    .076 
reversed 10000   .206
reversed 50000  3.744

sorted 5000      .047
sorted 10000     .172
sorted 50000    3.465

До встречи на новых лабах!


Запись опубликована в рубрике С (Си). Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.