调整数组元素的顺序前为奇数后为偶数

时间:2023-01-02 10:51:04

如题,考虑一种时间复杂度为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;
}
}
}

此题还有扩展问题

问题一:比如,一个数组,调整负数在前,正数在后,那么就需要调整判断的条件。

问题二:调整数组元素的同时,使得元素的相对位置不变,要求最小的时间复杂度和空间复杂度,那么如何做?