问题描述:
如题,要求:空间复杂度O(1),时间复杂度为O(n)。
问题求解:
用两个指针分别指向数组的头和尾,头指针正向遍历数组,找到第一个偶数,尾指针逆向遍历数组,找到第一个奇数,使用引用参数传值交换两个指针指向的数字,然后两指针沿着相应的方向继续向前移动,重复上述步骤,直到头指针大于等于尾指针为止。
#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void re_arrange(int a[], int n)
{
if(a==NULL || n==0)
{
cout<<"数组为空!"<<endl;
return;
}
int begin = 0;
int end = n-1;
while(begin < end)
{
while(a[begin]%2==1 && begin<end)
{
begin++;
}
while(a[end]%2==0 && begin<end)
{
end--;
}
swap(a[begin], a[end]);
}
}
int main()
{
//int a[] = {1,2,3,4,5,6};
int a[] = {};
int n = sizeof(a) / sizeof(a[0]);
cout<<n<<endl;
for(int i=0; i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
re_arrange(a, n);
for(int i=0; i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
上述解法利用了快排中partition的思想,若要问最少交换的次数是多少?
则可以在swap()的时候time++。