"""
3. Массив размером 2m + 1, где m – натуральное число, заполнен случайным образом.
Найдите в массиве медиану. Медианой называется элемент ряда, делящий его на
две равные части: в одной находятся элементы, которые не меньше медианы,
в другой – не больше медианы. Задачу можно решить без сортировки исходного
массива. Но если это слишком сложно, то используйте метод сортировки,
который не рассматривался на уроках
"""


import random
import numpy as np

"""
Реализация №1.
"""


def median_func_1(lst):
    """Поиск медианы_1"""
    center = COUNT // 2

    for _ in range(center):  # половину элементов сгенерированного списка убираем методом max
        max_el = (max(lst))
        idx_max = lst.index(max_el)
        lst.pop(idx_max)

    max_el = (max(lst))  # ещё один максимальный элемент является медианой
    idx_max = lst.index(max_el)
    return f'Найденная медиана: {lst.pop(idx_max)}'


M = random.randint(0, 5)  # для генерации случайной размерности массива
COUNT = 2 * M + 1
# для заполнения массива случайными элементами [0, 50)
LST = [random.randint(-50, 50) for _ in range(COUNT)]

print(f'\n{"-" * 15}Реализация №1{"-" * 15}')
print(f'Исходный список: {LST}')
print(f'Найденная медиана методом "median": {np.median(LST)}')
print(median_func_1(LST))

# ---------------Реализация №1---------------
# Исходный список: [-28, -21, -43, 19, -1, 5, 17, -22, 29]
# Найденная медиана методом "median": -1.0
# Найденная медиана: -1

'''
P.S. Знаю, что метод "сырой", но это первое что пришло в голову..
'''

"""
Реализация №2. (Реализация, как Вы объясняли на вебинаре)
"""


def median_func_2(lst):
    """Поиск медианы_2"""
    for elem in lst:
        count1, count2 = 0, 0
        for num in lst:
            if num < elem:
                count1 += 1
            elif num > elem:
                count2 += 1

        if count1 == count2:  # если имеет место случай когда el одинаково меньше и больше других элементов в массиве
            return elem  # то это и есть медиана


M = random.randint(0, 5)
COUNT = 2 * M + 1
LST = [random.randint(-50, 50) for _ in range(COUNT)]
print(f'\n{"-" * 15}Реализация №2{"-" * 15}')
print(f'Исходный список: {LST}')
print(f'Найденная медиана методом "median": {np.median(LST)}')
print(f'Найденная медиана: {median_func_2(LST)}')

# ---------------Реализация №2---------------
# Исходный список: [18, -4, -6, -30, -28]
# Найденная медиана методом "median": -6.0
# Найденная медиана: -6
