所有代码均通过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