剑指Offer之面试题36:数组中的逆序对

来源:互联网 发布:erp金蝶软件 编辑:程序博客网 时间:2024/06/06 09:35


所有代码均通过G++编译器测试,仅为练手纪录。


//面试题36:数组中的逆序对

//题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。

//    输入一个数组,求出这个数组中的逆序对的总数。


//面试题36:数组中的逆序对//题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。//     输入一个数组,求出这个数组中的逆序对的总数。int CountInversePairImpl(int *pNum,int *pTemp,int nBeg,int nEnd){    if(nBeg == nEnd)    {        pTemp[nBeg] = pNum[nBeg];        return 0;    }        int nMid = nBeg + (nEnd - nBeg)/2;        int nLeftCount = CountInversePairImpl(pTemp, pNum, nBeg, nMid);    int nRightCount = CountInversePairImpl(pTemp, pNum, nMid+1, nEnd);        int nPos = nEnd;    int nEndLeft = nMid;    int nEndRight = nEnd;        int nCurCount = 0;    while (nEndLeft >= nBeg && nEndRight >= nMid+1)    {        if (pNum[nEndLeft] > pNum[nEndRight])        {            pTemp[nPos--] = pNum[nEndLeft--];            nCurCount += nEndRight - nMid;        }        else        {            pTemp[nPos--] = pNum[nEndRight--];        }    }        while (nEndLeft >= nBeg)    {        pTemp[nPos--] = pNum[nEndLeft--];    }        while (nEndRight >= nMid+1)    {        pTemp[nPos--] = pNum[nEndRight--];    }        return (nLeftCount + nRightCount + nCurCount);}int CountInversePair(int *pNum,int nSize){    if(NULL == pNum || nSize <= 0)    {        return 0;    }        int *temp = new int[nSize];    if(NULL == temp)    {        return 0;    }        memcpy(temp,pNum,nSize);        int nCount = CountInversePairImpl(pNum,temp,0,nSize-1);        delete[] temp;        return nCount;}void TestCountInversePair(){    int arrNum[] = {7,5,6,4};    int nNumSize = sizeof(arrNum)/sizeof(int);        LogInfo("CountInversePair : %d",CountInversePair(arrNum,nNumSize));}



ZhaiPillary

2017-01-07


0 0
原创粉丝点击