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..4641bcc1 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,42 @@ Подсказка: обратите внимание, сортируем не по возрастанию, как в примере, а по убыванию """ + +import random + + +def bubble_sort(array, reverse=False): + sign = int(reverse) * 2 - 1 + n = 1 + + while n < len(array): + is_sort = True + for i in range(len(array) - n): + if array[i] * sign < array[i + 1] * sign: + array[i], array[i + 1] = array[i + 1], array[i] + is_sort = False + + if is_sort: + break + + n += 1 + print(array) + + +SIZE = 10 +LIMIT = 100 +data = [random.randrange(-LIMIT, LIMIT) for _ in range(SIZE)] + +print(data) +bubble_sort(data, reverse=True) +print(data) + +''' +Применена оптимизация естественности поведения. +На вход дан упорядоченный массив данных, и сортировать его не нужно. +Работает данная оптимизация с помощью: +is_sort = True # считается что массив отсортирован +is_sort = False # если были переставлены элементы, то массив считается не отсортированным +if is_sort: # в теле цикла проверили были ли изменения, прошли по всему массиву, если всё ок, ты выходим. +break +''' \ 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..b8d9cb5a 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,45 @@ Исходный - [46.11436617832828, 41.62921998361278, 18.45859540989644, 12.128870723745806, 8.025098788570562] Отсортированный - [8.025098788570562, 12.128870723745806, 18.45859540989644, 41.62921998361278, 46.11436617832828] """ + +import random + + +def merge_sort(array): + if len(array) <= 1: + return array + + elif len(array) == 2: + if array[0] > array[1]: + array[0], array[1] = array[1], array[0] + return array + + left = merge_sort(array[:len(array) // 2]) + right = merge_sort(array[len(array) // 2:]) + i = j = 0 + + while len(left) > i and len(right) > j: + if left[i] < right[j]: + array[i + j] = left[i] + i += 1 + else: + array[i + j] = right[j] + j += 1 + + while len(left) > i: + array[i + j] = left[i] + i += 1 + while len(right) > j: + array[i + j] = right[j] + j += 1 + + return array + + +SIZE = 10 +LIMIT = 50 +data = [random.uniform(0, LIMIT) for _ in range(SIZE)] + +print(data) +merge_sort(data) +print(data) 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..c5a68545 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,33 @@ массива. Но если это слишком сложно, то используйте метод сортировки, который не рассматривался на уроках """ + +import random + + +def median(array): + for i in range(len(array)): + my_min = equal = my_max = 0 + for j in range(len(array)): + if array[i] < array[j]: + my_min += 1 + elif array[i] > array[j]: + my_max += 1 + else: + equal += 1 + equal -= 1 + + if my_min == my_max or my_min == equal + my_max or my_max == equal + my_min or \ + (equal > 1 and abs(my_max - my_min) < equal): + return array[i] + + +SIZE = 4 +LIMIT = 100 +data = [random.randrange(0, LIMIT) for _ in range(2 * SIZE + 1)] + +print(data) +print(f'Медиана = {median(data)}') +print(data) +print(sorted(data)) +