要求时间复杂度为O(n),空间复杂度为O(1)程序如下:
#include <iostream>
using namespace std;
void Recorder(int *pData,unsigned int length, bool (*func)(int));
bool isEven(int n);
void RecorderOddEven(int *pData,unsigned int length)
{
if(pData==NULL||length==0)
return;
Recorder(pData,length,isEven);
}
void Recorder(int *pData,unsigned int length, bool (*func)(int))
{
if(pData==NULL||length==0)
return;
int *pBegin=pData;
int *pEnd=pData+length-1;
while(pBegin<pEnd)
{
if(!func(*pBegin))
{
pBegin++;
continue;
}
if(func(*pEnd))
{
pEnd--;
continue;
}
int temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
}
}
bool isEven(int n)
{
return (n&1)==0;
}
int main()
{
int a[10]={1,4,5,7,2,4,6,9,10,8};
RecorderOddEven(a,10);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
分析上述程序:
1,函数isEven判断一个数是不是偶数,其中用位运算&而不用%,因为位运算比%要快一些,另外一定不要写成&&,y因为n&&1永远不等于0,则永远返回false;
2,如果题改为负数位于前面,正数位于后面,则只把isEven函数改为isPositive,
bool isPositive(int n)
{ return (n>0)?1:0;
}
3,在函数Recorder中,用函数指针func指向的函数来判断一个数是不是符合给定的条件,而不是用代码直接判断,这样做的好处是如果变成其他相关的题,只要把函数改变就行,提高了代码的可维护性。