如题,考虑一种时间复杂度为O(n),空间复杂度为O(1)的算法,那就是维护两个指针,分别指向数组的首尾,然后分别判断所指向的元素是奇数还是偶数,符合条件指针分别向中间“靠拢”,不符合条件停止,然后交换这两个元素,使之符合题目条件。
参考代码如下
void OrderTheArrayToOddAndEven(int array[], int length)
{
if (array == NULL || length < 0)
return;
int *pBegin = array;
int *pEnd;
pEnd = pBegin + length - 1;
while (pBegin < pEnd)
{
while (pBegin < pEnd && (*pBegin & 0x1) != 0)
pBegin++;
while (pBegin < pEnd && (*pEnd & 0x1) == 0)
pEnd--;
if (pBegin < pEnd)
{
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
}
此题还有扩展问题
问题一:比如,一个数组,调整负数在前,正数在后,那么就需要调整判断的条件。
问题二:调整数组元素的同时,使得元素的相对位置不变,要求最小的时间复杂度和空间复杂度,那么如何做?