Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 30.05.2023
Сообщений: 19

Количество инверсий в массиве

11.01.2024, 20:34. Показов 2454. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста разобраться в задаче. Заранее благодарен!

Первая строка содержит число 1≤ n ≤ 10^5, вторая - массив A[1....n], содержащий натуральные числа, не превосходящие 10^9. Необходимо посчитать число пар индексов
1≤ i < j ≤ n, для которых A[i] > A[j]. (Такая пара элементов называется инверсией массива. Количество инверсий в массиве является в некотором смысле его мерой неупорядоченности: например, в упорядоченном по не убыванию массиве инверсий нет вообще, а в массиве, упорядоченном по убыванию, инверсию образуют каждые два элемента.)

Sample Input:

5
2 3 9 2 9

Sample Output:

2


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
GLOBAL_REPLACE_COUNT = 2
 
def merge(array: list, start: int, mid: int, end: int) -> None:
    
    global GLOBAL_REPLACE_COUNT
 
    l, m = 0, 0
    result = []
 
    while start + l < mid and m + mid < end:
        if array[start + l] <= array[mid + m]:
            result.append(array[start + l])
            l += 1
        else:
            result.append(array[mid + m])
            m += 1
           
 
    while start + l < mid:
        result.append(array[l + start])
        l += 1
 
    while m + mid < end:
        result.append(array[m + mid])
        m += 1
 
    for i in range(end - start):
        array[start + i] = result[i]
 
 
def merge_sort(array: list, start: int, end: int):
 
    if start + 1 < end:
        
        mid = int((start + end) / 2)
 
        ray, start, mid)
        
        merge_sort(array, mid, end)
        merge(array, start, mid, end)
        
        def main():
    
    length = int(input())
    array = list(map(int, input().split()))
    merge_sort(array, 0, len(array))
 
    print(GLOBAL_REPLACE_COUNT)
 
 
if __name__ == '__main__':
    main()
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2024, 20:34
Ответы с готовыми решениями:

Найти количество инверсий в массиве
Дан одномерный массив чисел. Помогите найти количество инверсий в массиве (т.е. таких пар элементов, в которых большее число находится...

Количество инверсий в массиве
Добрый день. Необходимо написать программу, которая выведет количество инверсий в массиве. Помогите разобраться и найти где ошибка. ...

Определить количество инверсий в массиве
Помогите пожалуйста Дан линейный неупорядоченный массив А, состоящий из 20 целых чисел. Составить программу, которая определяет...

5
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
12.01.2024, 01:28
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
input('n = ')
arr = list(map(int, input('->').split()))
L = []
res = 0
for e in arr:
    if not L:
        L += [e]
    else:
        k = len(L)-1
        while k > -1 and e < L[k]:
            k -= 1
            res += 1
        if k == -1 or e > L[k]:
            L.insert(k+1,e)
        else:
            L.insert(k,e)
print(res)
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
12.01.2024, 14:15
Xber, код решения какой задачи вы привели? В каком месте изменяется GLOBAL_REPLACE_COUNT?
Про ужасы в конце программы я пока промолчу.

Добавлено через 43 секунды
Хотя нет, не промолчу. Вы вообще понимаете что не так с этим кодом?
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
12.01.2024, 18:29
Если подключить модуль bisect, то можно ускорить алгоритм:
Python
1
2
3
4
5
6
7
8
9
10
from bisect import bisect_right
input('n = ')
arr = list(map(int, input('->').split()))
L = []
res = 0
for i in range(len(arr)):
    ind = bisect_right(L, arr[i])
    res += i-ind
    L.insert(ind, arr[i])
print(res)
3
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
12.01.2024, 20:23
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Разделяй и властвуй.
Примерно в 2.5 раза быстрее

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from random import seed, shuffle
from time import perf_counter
 
def calc_inversion(a):
    if len(a) <= 1:
        return 0
    if len(set(a)) == 1:
        return 0
    avg_a = sum(a) / len(a)
    l, r = [], []
    addition = 0
    for x in a:
        if x < avg_a:
            l.append(x)
            addition += len(r)
        else:
            r.append(x)
    return addition + calc_inversion(l) + calc_inversion(r)  
 
n = 100000
seed(42)
a = list(range(n))
shuffle(a)
start = perf_counter()
print(calc_inversion(a))
print(perf_counter()-start)
2
0 / 0 / 0
Регистрация: 30.05.2023
Сообщений: 19
12.01.2024, 21:29  [ТС]
Благодарю за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.01.2024, 21:29
Помогаю со студенческими работами здесь

Подсчитать количество инверсий в массиве
Нужно написать программу, которая подсчитывает колличество инверсий в массиве со временем работы в худшем случае n * lg(n). Решено...

Определить количество инверсий в массиве
Задан массив из n чисел. Определить количество инверсий в массиве (т.е. таких пар элементов, в которых большее количество находится слева...

Определить количество инверсий в массиве
определить количество инверсий в массиве Х т.е таких пар элементов, в которых большее число находится слева от меньшего:Xi&gt;Xj при i&lt;j.

Определить количество инверсий в массиве
Одна из лаб: - Задан массив из k чисел. Определить количество инверсий в массиве (т. е. таких пар элементов, в которых большее число...

Определить количество инверсий в массиве
Определить количество инверсий в этом массиве X (т.е. таких пар элементов, в которых большее число находится слева от меньшего: xi&gt;xj...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru