Алгоритм количества инверсий с сортировкой слиянием

#python #algorithm #recursion #mergesort

Вопрос:

Я пытаюсь выполнить задание Алгоритмического курса, предлагаемого Калифорнийским университетом Сан-Диего на Coursera, и у меня возникла проблема…

Я использовал алгоритм сортировки слиянием для подсчета инверсий путем суммирования количества элементов слева в левой массива ( a массив) для подсчета каждый раз, когда вы сливаете элемент из массива в правильном ( b массив), но я действительно не знаю, почему он не выдает правильное количество инверсий иногда, и это сводит меня с ума, вот код, и некоторые тестовые случаи:

 import sys

def get_number_of_inversions(a, left, right):
    number_of_inversions = 0
    # print(a)
    if right - left <= 1:
        return number_of_inversions
    mid = (left   right) // 2
    number_of_inversions = get_number_of_inversions(a, left, mid)
    number_of_inversions = get_number_of_inversions(a, mid, right)

    left_side = a[left:mid]
    right_side = a[mid:right]

    while len(left_side) > 0 and len(right_side) > 0:
        if left_side[0] <= right_side[0]:
            a[left] = left_side[0]
            left  = 1
            left_side.remove(left_side[0])
        else:
            a[left] = right_side[0]
            left  = 1
            right_side.remove(right_side[0])
            number_of_inversions  = len(left_side)
    if len(left_side) == 0:
        a[left] = right_side[0]
        left  = 1
    else:
        a[left] = left_side[0]
        left  = 1
    return number_of_inversions


if __name__ == '__main__':
    n = int(input())
    a = list(map(int, input().split()))
    print(int(get_number_of_inversions(a, 0, len(a))))
 

Тестовые примеры:

 6
9 8 7 3 2 1 
 

Этот должен давать 15, но он дает 12

 6
3 1 9 3 2 1
 

Этот должен давать 9, но он дает 8

Комментарии:

1. number_of_inversions = get_number_of_inversions(a, left, mid) number_of_inversions = get_number_of_inversions(a, mid, right) Разве так не должно быть = ?

2. Правильно, я совсем забыл об этом, спасибо!