diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..5c98b428
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/.idea/Python_Algos.iml b/.idea/Python_Algos.iml
new file mode 100644
index 00000000..7c9d48f0
--- /dev/null
+++ b/.idea/Python_Algos.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 00000000..105ce2da
--- /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 00000000..a2e120dc
--- /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 00000000..cd986194
--- /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 00000000..94a25f7f
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py"
index 07560cfa..6db6e56b 100644
--- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py"
+++ "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py"
@@ -9,3 +9,50 @@
Подсказка: обратите внимание, сортируем не по возрастанию, как в примере,
а по убыванию
"""
+from random import randint
+from timeit import timeit
+
+LST = [randint(-100, 100) for _ in range(30)]
+print(LST)
+
+
+def bubble_1(old_lst, cnt=0):
+ lst = old_lst[:]
+ for _ in range(len(lst) - 1):
+ for i in range(len(lst)):
+ if lst[i] > lst[i - 1] and i > 0:
+ lst[i], lst[i - 1] = lst[i - 1], lst[i]
+ return lst
+
+
+print(timeit("bubble_1(LST)", \
+ setup="from __main__ import bubble_1, LST", number=100))
+print(bubble_1(LST))
+
+
+def bubble_2(old_lst, sort=1):
+ lst = old_lst[:]
+ while sort > 0:
+ sort = 0
+ for i in range(len(lst)):
+ if lst[i] > lst[i - 1] and i > 0:
+ lst[i], lst[i - 1] = lst[i - 1], lst[i]
+ sort += 1
+ return lst
+
+
+print(timeit("bubble_2(LST)", \
+ setup="from __main__ import bubble_2, LST", number=100))
+
+print(bubble_2(LST))
+
+print(LST)
+
+"""
+Доработка скрипта привела к тому что в большинстве случаев скорость выполнения увеличилась
+один из вариантов
+0.015818744000000003 - старый вариант
+0.009746643000000013 - новый
+Я пробовал ставить счетчики на циклы, вышло что в наилучшем случае при списке длиной в 10 элементов
+улучшеный скрипт справлялся за 5 проходов вместо 9. Но чаще это 8 или 7.
+"""
\ No newline at end of file
diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py"
index 73d3dfb6..c3f17e66 100644
--- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py"
+++ "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py"
@@ -8,3 +8,91 @@
Исходный - [46.11436617832828, 41.62921998361278, 18.45859540989644, 12.128870723745806, 8.025098788570562]
Отсортированный - [8.025098788570562, 12.128870723745806, 18.45859540989644, 41.62921998361278, 46.11436617832828]
"""
+
+from random import uniform
+from timeit import timeit
+
+element = int(input('Введите число элементов:'))
+LST = [uniform(0, 50) for _ in range(element)]
+LST1 = LST[:]
+print(LST)
+
+'''
+Это первая версия. Ее я решил написать не заглядывая в ваш пример.
+Она оказалась рабочая, но работала медленнее чем ваша.
+Чем больше был массив, тем больше разница. При массиве
+в 100 тыс она была уже в 3 раз, на 200 в 5, и дальше увеличивалась в разы
+миллион было уже не дождаться.
+Тогда я посмотрел вашу версию и перелелал часть своей.
+Стала летать.
+
+Возможно моя работала медленнее из-за того что использовал extend и pop
+
+
+'''
+
+
+def merger_sort_1(lst):
+ center = len(lst) // 2
+ tmp = []
+ left_list = lst[:center]
+ right_list = lst[center:]
+ if len(left_list) > 1:
+ left_list = merger_sort_1(left_list)
+ if len(right_list) > 1:
+ right_list = merger_sort_1(right_list)
+
+ while True:
+ if len(left_list) == 0:
+ tmp.extend(right_list)
+ break
+ elif len(right_list) == 0:
+ tmp.extend(left_list)
+ break
+ if left_list[0] < right_list[0]:
+ tmp.append(left_list.pop(0))
+ else:
+ tmp.append(right_list.pop(0))
+ return tmp
+
+
+def merger_sort_2(lst):
+ center = len(lst) // 2
+ left_list = lst[:center]
+ right_list = lst[center:]
+ if len(left_list) > 1:
+ left_list = merger_sort_2(left_list)
+ if len(right_list) > 1:
+ right_list = merger_sort_2(right_list)
+
+ i, j, k = 0, 0, 0
+ while i < len(left_list) and j < len(right_list):
+ if left_list[i] < right_list[j]:
+ lst[k] = left_list[i]
+ i += 1
+ else:
+ lst[k] = right_list[j]
+ j += 1
+ k += 1
+
+ while i < len(left_list):
+ lst[k] = left_list[i]
+ i += 1
+ k += 1
+
+ while j < len(right_list):
+ lst[k] = right_list[j]
+ j += 1
+ k += 1
+ return lst
+
+
+print(timeit("merger_sort_1(LST1)", \
+ setup="from __main__ import merger_sort_1, LST1", number=1))
+
+print(merger_sort_1(LST1))
+
+print(timeit("merger_sort_2(LST)", \
+ setup="from __main__ import merger_sort_2, LST", number=1))
+
+print(merger_sort_2(LST))
diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py"
index 33530404..da882ae2 100644
--- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py"
+++ "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py"
@@ -6,3 +6,45 @@
массива. Но если это слишком сложно, то используйте метод сортировки,
который не рассматривался на уроках
"""
+from random import randint
+
+M = 5
+LST = [randint(0, 50) for _ in range(2 * M + 1)]
+
+
+def median(lst, old_lst):
+ left_lst_old = [i for i in old_lst if i < lst[0]]
+ right_lst_old = [i for i in old_lst if i > lst[0]]
+ cnt = lst.count(lst[0])
+ if cnt > 1:
+ for i in range(cnt - 1):
+ if len(left_lst_old) > len(right_lst_old):
+ right_lst_old.append(lst[0])
+ else:
+ left_lst_old.append(lst[0])
+
+ left_lst = [i for i in lst if i < lst[0]]
+ right_lst = [i for i in lst if i > lst[0]]
+
+ if len(left_lst_old) == len(right_lst_old):
+ return lst[0]
+
+ elif len(left_lst_old) > len(right_lst_old):
+ return median(left_lst, old_lst)
+ else:
+ return median(right_lst, old_lst)
+
+
+print(f'В массиве {LST} медианой является число {median(LST, LST)}')
+
+
+"""
+Вычисление происходит с помошью рекурсии. Берется 0-й элемент массива. Находятся все элементы меньше него
+и больше него. Если элемент присутствует несколько раз, то элементы раскидываются по левому и правому списку
+для уравновешивания. Если списки равны по длинне, то медиана найдена. Если нет, то надо брать следующий элемент,
+но тогда пришлось бы перебирать все, пока не попадется нужный. Что бы ускорить процесс, мы паралельно создаем еще
+правый и левый список, без повторов опорного элемента и тех значений которые мы уже отсекли, и если правый список
+длиннее левого, то значит что медиана находится там, именно его мы и отправляем рекурсивно в функцию, которая снова
+делит список и ищет медиану, сверяясь с старым, полным списком. Так как мы каждый раз отсекаем диапазон чисел,
+поиск происходит быстро.
+"""
\ No newline at end of file