题目描述:
输入一个整数数组,调整该数组中元素的顺序,使所有奇数位于数组前半部分,偶数位于后半部分;
思路一:
从数组的首元素开始扫描,若遇到偶数,将其拿出,并将该元素后面的元素一次迁移,这样挪完后,数组末尾空出移位,则再将偶数元素赋予该空位;
这样没遇到一个偶数元素,需要移动次数为O(n),假设数组元素个数为n;则时间复杂度为O(n*n);
思路二:
设置两个指针pBegin ,pEnd;pBegin指向数组的首元素,pEnd指向数组的末尾元素;
若*pBegin 为奇数,则pBegin++,直到指向偶数;
若*PEnd为偶数,则pEnd--,直到指向奇数;
当*pBegin 为偶数,*pEnd为奇数,二者交换;
时间复杂度O(n);
代码实现:
#include<iostream>
#include<exception>
using namespace std;
//---------------------------------------------使奇数位于偶数前面---------------------------------------
//O(n*n)
void OddbeforeEven_Soulation1(int* data , int length)
{
if(data == NULL || length <= 0)
return;
int temp;
for(int i = 0; i < length; i++)
{
if(data[i] % 2 == 0)
temp = data[i];
int j = i + 1;
for( ; j < length; j++)
{
data[j - 1] = data[j];
}
data[j] = temp;
}
}
//O(n)
void OddbeforeEven_Soulation2(int* data , int length)
{
if(data == NULL || length <= 0)
return;
int* pBegin = data;
int* pEnd = data + length - 1;
while(pBegin < pEnd)
{
//从前往后找到偶数
while((pBegin < pEnd) && (*pBegin % 2 != 0))
pBegin++;
//从后往前找到奇数
while((pBegin < pEnd) && (*pEnd % 2 == 0))
pEnd--;
if(pBegin < pEnd)
{
swap(*pBegin , *pEnd);
}
}
}