Merge Sort: Counting Inversions

  • + 0 comments

    !/bin/python3

    import math import os import random import re import sys

    #

    Complete the 'countInversions' function below.

    #

    The function is expected to return a LONG_INTEGER.

    The function accepts INTEGER_ARRAY arr as parameter.

    #

    def countInversions(arr):

    def merge_sort_count(arr):
        if len(arr) <= 1:
            return arr, 0
    
        mid = len(arr) // 2
        left, left_inv = merge_sort_count(arr[:mid])
        right, right_inv = merge_sort_count(arr[mid:])
    
        merged, split_inv = merge_count(left, right)
        total_inv = left_inv + right_inv + split_inv
        return merged, total_inv
    
    def merge_count(left, right):
        merged = []
        i = j = 0
        inversions = 0
        while i < len(left) and j < len(right):
            if left[i] <= right[j]:
                merged.append(left[i])
                i += 1
            else:
                merged.append(right[j])
                inversions += len(left) - i
                j += 1
    
        merged.extend(left[i:])
        merged.extend(right[j:])
        return merged, inversions
    
    _, total_inversions = merge_sort_count(arr)
    return total_inversions
    

    if name == 'main': fptr = open(os.environ['OUTPUT_PATH'], 'w')

    t = int(input().strip())
    
    for t_itr in range(t):
        n = int(input().strip())
    
        arr = list(map(int, input().rstrip().split()))
    
        result = countInversions(arr)
    
        fptr.write(str(result) + '\n')
    
    fptr.close()