- •Лабораторная работа №1 «Методы сортировки» Вариант №12 «Пирамидальная сортировка»
- •Лабораторная работа №2 «Методы поиска» Вариант №12 «Метод цепочек»
- •Лабораторная работа №3 «Методы поиска подстроки в строке» Вариант №12 «Кнута-Морриса-Прата»
- •Лабораторная работа №5 «Рекурсия. Фракталы.» Вариант №10 «Салфетка Серпинского»
Оглавление
Лабораторная работа №1 «Методы сортировки» 2
Лабораторная работа №2 «Методы поиска» 7
Лабораторная работа №3 «Методы поиска подстроки в строке» 12
Лабораторная работа №4 «Реализация стека/дека» 18
Лабораторная работа №5 «Рекурсия. Фракталы.» 20
Лабораторная работа №1 «Методы сортировки» Вариант №12 «Пирамидальная сортировка»
Цель работы:
Реализовать заданный метод сортировки строк числовой матрицы в соответствии с индивидуальным заданием. Для всех вариантов добавить реализацию быстрой сортировки (quicksort). Оценить время работы каждого алгоритма сортировки и сравнить его со временем стандартной функции сортировки, используемой в выбранном языке программирования.
Ход работы:
Для реализации целей лабораторной работы выбрала язык программирования Python. Для сравнения сортировок написала функцию быстрой сортировки:
def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quicksort(left) + middle + quicksort(right)
Также реализовала пирамидальную сортировку:
def heapsort(arr): n = len(arr) for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0)
Для создания изначальной кучи, добавила возможность ввода размера массива, генерацию массива и создание таблицы, для вывода конечных результатов. Сравнение скорости выполнения сортировки разными методами на примере массива размером 100000:
|
Пирамидальная сортировка, мс |
Встроенная сортировка, мс |
Быстрая сортировка, мс |
1 |
12.981 |
15.081 |
155.561 |
2 |
13.130 |
18.857 |
126.689 |
3 |
15.254 |
16.707 |
178.601 |
4 |
15.045 |
27.853 |
163.745 |
5 |
12.689 |
11.778 |
91.341 |
Среднее время выполнения каждого из алгоритмов:
Пирамидальная сортировка – 13.820мс
Встроенная сортировка – 18.055мс
Быстрая сортировка – 143.188мс
Можно проследить, что лучше всего себя показала Пирамидальная сортировка. Но мы можем повторить опыт для массива размером 1000000:
|
Пирамидальная сортировка, мс |
Встроенная сортировка, мс |
Быстрая сортировка, мс |
1 |
150.040 |
149.962 |
1621.002 |
2 |
166.478 |
148.201 |
1404.876 |
3 |
213.159 |
158.855 |
1348.476 |
4 |
177.263 |
154.360 |
1373.148 |
5 |
138.301 |
145.818 |
1423.088 |
Среднее время выполнения каждого из алгоритмов:
Пирамидальная сортировка – 169.048мс
Встроенная сортировка – 151.439мс
Быстрая сортировка – 1434.118мс
При наибольшем размере массива, наилуший результат показала Встроенная сортировка, а худший – Быстрая сортировка. Обращаем внимание на то, что при сортировках использовался одинаковый массив случайно сгенерированных чисел
Код программы:
import time import random def heapify(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heapsort(arr): n = len(arr) for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quicksort(left) + middle + quicksort(right) def generate_random_array(size): return [random.randint(0, 1000) for _ in range(size)] def measure_time(func, arr): start_time = time.time() func(arr.copy()) return (time.time() - start_time) * 1000 def print_table(results): print("| n | Пирамидальная сортировка,мс | Встроенная сортировка,мс | Быстрая сортировка,мс |") print("|---|---|---|---|") for i, row in enumerate(results): print(f"| {i+1} | {row[0]:.3f} | {row[1]:.3f} | {row[2]:.3f} |") def main(): size = int(input("Введите размер массива: ")) results = [] for _ in range(5): arr = generate_random_array(size) shell_time = measure_time(sorted, arr) std_time = measure_time(sorted, arr) quick_time = measure_time(quicksort, arr) results.append([shell_time, std_time, quick_time]) print_table(results) avg_shell = sum(row[0] for row in results) / 5 avg_std = sum(row[1] for row in results) / 5 avg_quick = sum(row[2] for row in results) / 5 print("\nСреднее время выполнения каждого из алгоритмов:") print(f"Пирамидальная сортировка – {avg_shell:.3f}мс") print(f"Сортировка Питон – {avg_std:.3f}мс") print(f"Быстрая сортировка – {avg_quick:.3f}мс") if __name__ == "__main__": main()
Вывод:
При меньшем размере массива (100 000 элементов) пирамидальная сортировка показала лучший результат, опередив встроенную сортировку и быструю сортировку. Однако при увеличении размера массива до 1 000 000 элементов ситуация изменилась: встроенная сортировка стала лидером по скорости, а быстрая сортировка значительно отстала по времени выполнения.
