算法导论部分习题备注

2.4 Inversions

Let A[1...n]be an array of n distinct numbers. If i < j and A[i] > A[j], then the
pair(i, j)is called an inversion of A.
Give an algorithm that determines the number of inversions in any permutation
on n elements in O(nlgn) worst-case time. (Hint: Modify merge sort.)
Thinking: We may think both A[i…j] and A[j+1…k] are sorted subarray of A (0 <= i < j < k <= n). if A[x](i<=x<=j) is bigger than A[j+1], then all numbers behind A[x] are bigger than A[j+1], so there are j-x+1 inversions bigger than A[j+1].
class Solution {
public:
    int getInversionNumbers(vector<int>& data, int begin, int end) {
        if (begin < end - 1) {
            int middle = (begin + end - 1) / 2;
            int left = solute(data, begin, middle + 1);
            int right = solute(data, middle + 1, end);
            return findAndSort(data, begin, middle + 1, end) + left + right;
        }
        return 0;
    }

private:
    int findAndSort(vector<int>& data, int start, int middle, int end) {
        vector<int> left(data.begin() + start, data.begin() + middle);
        vector<int> right(data.begin() + middle, data.begin() + end);

        int i = 0, j = 0, k = start;
        int count = 0;
        while (i < left.size() && j < right.size()) {
            if (left[i] > right[j]) {
                // If current item in left bigger than the the current item of right,
                // then all items after current left item is bigger than the left.
                count += left.size() - i;
                data[k++] = right[j++];
            } else {
                data[k++] = left[i++];
            }
        }
        while (i < left.size()) data[k++] = left[i++];
        while (j < right.size()) data[k++] = right[j++];

        return count;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值