Вася изучил алгоритм сортировки пузырьком по неубыванию. Он решил реализовать его для массива целых чисел [13, 18, 7, 4, 10, 14, 15, 17, 2, 5, 9, 16, 11, 3, 20, 6, 19, 12, 8, 1] так: выбираем два случайных соседних элемента в ...

Вася изучил алгоритм сортировки пузырьком по неубыванию. Он решил реализовать его для массива целых чисел [13, 18, 7, 4, 10, 14, 15, 17, 2, 5, 9, 16, 11, 3, 20, 6, 19, 12, 8, 1] так: выбираем два случайных соседних элемента в массиве, если левый больше правого, меняем их местами, иначе ничего не делаем. Из любопытства, после каждого обмена он выводил новый массив на экран. Через какое-то время на экране оказался массив [4, 7, 2, 5, 10, 9, 13, 11, 3, 14, 6, 15, 12, 8, 1, 16, 17, 18, 19, 20], а компьютер завис. Сколько операций обмена было сделано за время работы программы? В качестве ответа укажите одно натуральное число, например, 100. Пример. Пусть был массив [5, 4, 3, 2, 1], а через некоторое время появился массив [4, 5, 3, 1, 2]. Тогда за время работы программы было сделано две операции обмена — поменялись местами числа 5 и 4 и числа 2 и 1.
Гость
Ответ(ы) на вопрос:
Гость
Назовём инверсией пару элементов массива, в котором элемент с меньшим номером больше элемента с большим номером. Заметим, что после каждого обмена число инверсий в массиве уменьшается на 1. Тогда, посчитав число инверсий до работы программы и после, и вычтя из первого второе, мы получим число операций обмена. Массив небольшой, и можно подсчитывать инверсии как угодно. python 3.5: before = [13, 18, 7, 4, 10, 14, 15, 17, 2, 5, 9, 16, 11, 3, 20, 6, 19, 12, 8, 1]  after =  [4, 7, 2, 5, 10, 9, 13, 11, 3, 14, 6, 15, 12, 8, 1, 16, 17, 18, 19, 20]   def countInversions(arr):   counter = 0   for i in range(len(arr) - 1):     for j in range(i + 1, len(arr)):       if arr[i] > arr[j]:         counter += 1   return counter    print(countInversions(before) - countInversions(after)) Ответ: 60.
Не нашли ответ?
Ответить на вопрос
Похожие вопросы