diff --git a/HW7/task_1.py b/HW7/task_1.py new file mode 100644 index 00000000..eca6437f --- /dev/null +++ b/HW7/task_1.py @@ -0,0 +1,54 @@ +""" +1. Отсортируйте по убыванию методом "пузырька" одномерный целочисленный массив, +заданный случайными числами на промежутке [-100; 100). Выведите на экран +исходный и отсортированный массивы. Сортировка должна быть реализована в +виде функции. Обязательно доработайте алгоритм (сделайте его умнее). +Идея доработки: если за проход по списку не совершается ни одной сортировки, то завершение +Обязательно сделайте замеры времени обеих реализаций +Подсказка: обратите внимание, сортируем не по возрастанию, как в примере, +а по убыванию +""" + + +# from random import randint +import random +import timeit + + +def bubble_sort(original_list): + n = 1 + while n < len(original_list): + for i in range(len(original_list) - n): + if original_list[i] > original_list[i + 1]: + original_list[i], original_list[i + 1] = original_list[i + 1], original_list[i] + n += 1 + return original_list + + +"Доробатываем алгоритм" +def revert_bubble(original_list_2): + n = 1 + t = 0 + while n < len(original_list_2): + for i in range(len(original_list_2) - n): + if original_list_2[i] < original_list_2[i + 1]: + original_list_2[i], original_list_2[i + 1] = original_list_2[i + 1], original_list_2[i] + t = 1 + if t == 0: + break + n += 1 + return original_list_2 + +original_list = [random.randint(-100, 100) for _ in range(100)] +print(f'Исходные массивы:\n{original_list}\n') + +original_list_2 = [random.randint(-100, 100) for _ in range(100)] +print(f'Сортированные массивы:\n{original_list_2}\n') + +print(timeit.timeit("bubble_sort(original_list)", setup="from __main__ import bubble_sort, original_list", number=1000)) +print(timeit.timeit("revert_bubble(original_list_2)", setup="from __main__ import revert_bubble, original_list_2", number=1000)) + +"""Результат замеров +original_list: 0.2859691070043482 +original_list_2: 0.00576216698391363 +По этим данным можно сделать вывод, что доработка показала эффективность""" \ No newline at end of file diff --git a/HW7/task_2.py b/HW7/task_2.py new file mode 100644 index 00000000..f5a72c36 --- /dev/null +++ b/HW7/task_2.py @@ -0,0 +1,52 @@ +""" +2. Отсортируйте по возрастанию методом слияния одномерный вещественный массив, +заданный случайными числами на промежутке [0; 50). Выведите на экран исходный +и отсортированный массивы. +Пример: +Введите число элементов: 5 +Исходный - [46.11436617832828, 41.62921998361278, 18.45859540989644, 12.128870723745806, 8.025098788570562] +Отсортированный - [8.025098788570562, 12.128870723745806, 18.45859540989644, 41.62921998361278, 46.11436617832828] +""" + + +import numpy +import timeit + + +def merge_sort(orig_list): + to_be_sorted = orig_list[:] + if len(orig_list) > 1: + center = len(orig_list) // 2 + left = orig_list[:center] + right = orig_list[center:] + + merge_sort(left) + merge_sort(right) + + i = 0 + j = 0 + k = 0 + + while i < len(left) and j < len(right): + if left[i] < right[j]: + orig_list[k] = left[i] + i += 1 + else: + orig_list[k] = right[j] + j += 1 + k += 1 + + while i < len(left): + orig_list[k] = left[i] + i += 1 + k += 1 + + while j < len(right): + orig_list[k] = right[j] + j += 1 + k += 1 + return to_be_sorted + +orig_list = [numpy.random.uniform(0.000000000000000, 50.000000000000000) for _ in range(5)] +print(f"Исходный массив:\n{orig_list}\n") +print(f"Отсортированный массив:\n{merge_sort(orig_list)}\n") \ No newline at end of file