[검지offer] 수조의 역순 대조

3853 단어
/* 36:>   (7,4)    */

int InversePairsCore(int data[], int copy[], int start, int end);

int InversePairs(int data[],int len)
{
    if (data == NULL || len < 0)
        return 0;

    int* copy = new int[len];
    for (int i = 0; i < len; ++i)
        copy[i] = data[i];

    int count = InversePairsCore(data, copy, 0, len - 1);
    delete[]copy;

    return count;
}

int InversePairsCore(int data[], int copy[], int start, int end)
{
    if (start == end)
    {
        copy[start] = data[start];
        return 0;
    }

    int length = (end - start) / 2;

    int left = InversePairsCore( copy, data,start, start + length);
    int right = InversePairsCore(copy, data, start+length+1, end);

    int i = start + length;
    int j = end;
    int indexCopy = end;
    int count = 0;

    while (i>=start && j>=start+length+1)
    {
        if (data[i] > data[j])
        {
            copy[indexCopy--] = data[i--];
            count += j - start - length;
        }
        else
            copy[indexCopy--] = data[j--];
    }

    for (; i >= start; --i)
        copy[indexCopy--] = data[i];

    for (; j >= start + length + 1; --j)
        copy[indexCopy--] = data[j];


    return left + right + count;
}

//void test()
//{
// int ar[4] = {7,5,6,4};
// cout << InversePairs(ar, 4) << endl;
//}

좋은 웹페이지 즐겨찾기