剑指offer|数组中的逆序对

来源:互联网 发布:语音输入翻译软件 编辑:程序博客网 时间:2024/06/06 02:04

题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

思路:

使用归并排序算法的思想从下到上来做。

class Solution {public:    int InversePairs(vector<int> data) {        if(data.empty())            return 0;        return mergeSort(data,0,data.size()-1);    }    int mergeSort(vector<int>& data, int begin, int end)    {        if(begin >= end)            return 0;        int mid= (end+begin)/2;        int left=mergeSort(data,begin,mid);        int right=mergeSort(data,mid+1,end);        int count=0;        vector<int> copy(data);        int inxCopy=end;        int inxLeft=mid;        int inxRight=end;        while(inxLeft>=begin && (inxRight>= mid+1))        {            if(data[inxLeft]>data[inxRight])            {                count += inxRight-mid;                copy[inxCopy--]=data[inxLeft--];            }            else            {                copy[inxCopy--]=data[inxRight--];            }        }        while(inxLeft>=begin)            copy[inxCopy--]=data[inxLeft--];        while(inxRight >= mid+1)            copy[inxCopy--]=data[inxRight--];        for(int i=begin;i<=end;++i)            data[i]=copy[i];        return (count+left+right);    }};
0 0