Counting inversions in an array

前端 未结 30 2449
死守一世寂寞
死守一世寂寞 2020-11-22 04:14

I\'m designing an algorithm to do the following: Given array A[1... n], for every i < j, find all inversion pairs such that A[i] > A[j]

30条回答
  •  情话喂你
    2020-11-22 04:47

    Here's my O(n log n) solution in Ruby:

    def solution(t)
        sorted, inversion_count = sort_inversion_count(t)
        return inversion_count
    end
    
    def sort_inversion_count(t)
        midpoint = t.length / 2
        left_half = t[0...midpoint]
        right_half = t[midpoint..t.length]
    
        if midpoint == 0
            return t, 0
        end
    
        sorted_left_half, left_half_inversion_count = sort_inversion_count(left_half)
        sorted_right_half, right_half_inversion_count = sort_inversion_count(right_half)
    
        sorted = []
        inversion_count = 0
        while sorted_left_half.length > 0 or sorted_right_half.length > 0
            if sorted_left_half.empty?
                sorted.push sorted_right_half.shift
            elsif sorted_right_half.empty?
                sorted.push sorted_left_half.shift
            else
                if sorted_left_half[0] > sorted_right_half[0]
                    inversion_count += sorted_left_half.length
                    sorted.push sorted_right_half.shift
                else
                    sorted.push sorted_left_half.shift
                end
            end
        end
    
        return sorted, inversion_count + left_half_inversion_count + right_half_inversion_count
    end
    

    And some test cases:

    require "minitest/autorun"
    
    class TestCodility < Minitest::Test
        def test_given_example
            a = [-1, 6, 3, 4, 7, 4]
            assert_equal solution(a), 4
        end
    
        def test_empty
            a = []
            assert_equal solution(a), 0
        end
    
        def test_singleton
            a = [0]
            assert_equal solution(a), 0
        end
    
        def test_none
            a = [1,2,3,4,5,6,7]
            assert_equal solution(a), 0
        end
    
        def test_all
            a = [5,4,3,2,1]
            assert_equal solution(a), 10
        end
    
        def test_clones
            a = [4,4,4,4,4,4]
            assert_equal solution(a), 0
        end
    end
    

提交回复
热议问题