diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/algorithms-python-17-04-21.iml b/.idea/algorithms-python-17-04-21.iml
new file mode 100644
index 0000000..74d515a
--- /dev/null
+++ b/.idea/algorithms-python-17-04-21.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..81dd32a
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..c95a575
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/task1.py b/task1.py
new file mode 100644
index 0000000..cebfaff
--- /dev/null
+++ b/task1.py
@@ -0,0 +1,69 @@
+"""
+1. Отсортируйте по убыванию методом "пузырька" одномерный целочисленный массив,
+заданный случайными числами на промежутке [-100; 100). Выведите на экран
+исходный и отсортированный массивы.
+Сортировка должна быть реализована в виде функции.
+Обязательно доработайте алгоритм (сделайте его умнее).
+Идея доработки: если за проход по списку не совершается ни одной сортировки,
+то завершение. Обязательно сделайте замеры времени обеих реализаций
+и обосновать дала ли оптимизация эффективность
+Подсказка: обратите внимание, сортируем не по возрастанию, как в примере,
+а по убыванию.
+Сделайте выводы!!!
+Опишите в чем была ваша доработка и помогла ли вам доработка??
+"""
+
+# Сделал доработку из подсказки. Сделал три пары замеров:
+# - С уже отсортированным списком
+# - С относительно большими случайными списками
+# - С очень маленькими случайными спискоми
+# В первом случае улучшенный алгоритм работает на порядок быстрее, в третьем улучшенный работает чуть быстрее,
+# а во втором разницы почти нет. Связанно это с тем, что маленькие списки с гораздо большей вероятностью
+# генерируются полностью или частично отсортированными, чем большие, а доработка расчитана как раз на такие случаи.
+# Замеры с уже отсортированным списком показывают, что доработка действует.
+
+
+from random import randint
+from timeit import timeit
+
+
+def create_rand_lst(num):
+ return [randint(-100, 100) for _ in range(num)]
+
+
+def sort_bubble(lst):
+ n = 1
+ while n < len(lst):
+ for i in range(len(lst) - n):
+ if lst[i] < lst[i + 1]:
+ lst[i], lst[i + 1] = lst[i + 1], lst[i]
+ n += 1
+ return lst
+
+
+def better_sort_bubble(lst):
+ n = 1
+ while n < len(lst):
+ sort_count = 0
+ for i in range(len(lst) - n):
+ if lst[i] < lst[i + 1]:
+ sort_count = 1
+ lst[i], lst[i + 1] = lst[i + 1], lst[i]
+ if sort_count == 0:
+ break
+ n += 1
+ return lst
+
+
+lst1 = create_rand_lst(100)
+print(lst1)
+print(sort_bubble(lst1))
+print(timeit('sort_bubble(lst1)', number=1000, globals=globals()))
+print(timeit('better_sort_bubble(lst1)', number=1000, globals=globals()))
+
+print(timeit('sort_bubble(create_rand_lst(100))', number=10000, globals=globals()))
+print(timeit('better_sort_bubble(create_rand_lst(100))', number=10000, globals=globals()))
+
+print(timeit('sort_bubble(create_rand_lst(5))', number=1000000, globals=globals()))
+print(timeit('better_sort_bubble(create_rand_lst(5))', number=1000000, globals=globals()))
+
diff --git a/task2.py b/task2.py
new file mode 100644
index 0000000..3998037
--- /dev/null
+++ b/task2.py
@@ -0,0 +1,71 @@
+"""
+2. Отсортируйте по возрастанию методом слияния одномерный вещественный массив,
+заданный случайными числами на промежутке [0; 50). Выведите на экран исходный
+и отсортированный массивы.
+Хотя в примерах к уроку уже есть вариант реализации слияния,
+попробуйте предложить другой (придумать или найти).
+И попытаться сделать замеры на массивах разной длины: 10, 100, 1000, ...
+Пример:
+Введите число элементов: 5
+Исходный - [46.11436617832828, 41.62921998361278, 18.45859540989644, 12.128870723745806, 8.025098788570562]
+Отсортированный - [8.025098788570562, 12.128870723745806, 18.45859540989644, 41.62921998361278, 46.11436617832828]
+"""
+
+
+# Замеры показали, что пузырьковый метод работает быстрее на списках размером меньше 20 элементов,
+# после этого слияние работает быстрее и чем больше размер списка, тем существеннее разница в скорости.
+
+
+from random import uniform
+from timeit import timeit
+
+
+def create_rand_lst(num):
+ return [uniform(0, 50) for _ in range(num)]
+
+
+def merge_sort(lst):
+ if len(lst) < 2:
+ return lst
+ result = []
+ mid = len(lst) // 2
+ left = merge_sort(lst[:mid])
+ right = merge_sort(lst[mid:])
+ i = 0
+ j = 0
+ while i < len(left) and j < len(right):
+ if left[i] > right[j]:
+ result.append(right[j])
+ j += 1
+ else:
+ result.append(left[i])
+ i += 1
+ result += left[i:]
+ result += right[j:]
+ return result
+
+
+# Пузырьковая сортировка из первого задания для сравнения
+def better_sort_bubble(lst):
+ n = 1
+ while n < len(lst):
+ sort_count = 0
+ for i in range(len(lst) - n):
+ if lst[i] < lst[i + 1]:
+ sort_count = 1
+ lst[i], lst[i + 1] = lst[i + 1], lst[i]
+ if sort_count == 0:
+ break
+ n += 1
+ return lst
+
+
+lst1 = create_rand_lst(10)
+print(lst1)
+print(merge_sort(lst1))
+print(timeit('merge_sort(create_rand_lst(10))', number=10000, globals=globals()))
+print(timeit('better_sort_bubble(create_rand_lst(10))', number=10000, globals=globals()))
+print(timeit('merge_sort(create_rand_lst(100))', number=10000, globals=globals()))
+print(timeit('better_sort_bubble(create_rand_lst(100))', number=10000, globals=globals()))
+print(timeit('merge_sort(create_rand_lst(1000))', number=10000, globals=globals()))
+print(timeit('better_sort_bubble(create_rand_lst(1000))', number=10000, globals=globals()))
\ No newline at end of file
diff --git a/task3.py b/task3.py
new file mode 100644
index 0000000..832ea6d
--- /dev/null
+++ b/task3.py
@@ -0,0 +1,48 @@
+"""
+3. Массив размером 2m + 1, где m – натуральное число, заполнен случайным образом.
+Найдите в массиве медиану. Медианой называется элемент ряда, делящий его на
+две равные по длине части: в одной находятся элементы, которые не меньше медианы,
+в другой – не больше медианы.
+Задачу можно решить без сортировки исходного массива.
+Но если это слишком сложно, то используйте метод сортировки,
+который не рассматривался на уроках: Шелла, Гномья, Кучей...
+[5, 3, 4, 3, 3, 3, 3]
+[3, 3, 3, 3, 3, 4, 5]
+my_lst
+new_lts
+arr[m]
+from statistics import median
+[3, 4, 3, 3, 5, 3, 3]
+left = []
+right = []
+left == right and
+for i in
+ for
+ left == right
+ left.clear()
+ right.clear()
+"""
+
+
+def median(lst):
+ half = len(lst)//2
+ smaller = []
+ bigger = []
+ m = lst[0]
+ for i in lst:
+ if i > m:
+ bigger.append(i)
+ if len(bigger) >= half:
+ smaller.append(m)
+ m = min(bigger)
+ bigger.remove(m)
+ elif i < m:
+ smaller.append(i)
+ if len(smaller) >= half:
+ bigger.append(m)
+ m = max(smaller)
+ smaller.remove(m)
+ return m
+
+
+print(median([3, 3, 3, 3, 3, 4, 5]))