问题描述:
将一个整型数组的奇数移到最左边,偶数移到最右边,要求时间复杂度为O(n)。
解法一:
使用辅助空间,遍历目标数组,奇数从辅助数组的前面开始存,偶数从辅助数组的后面开始存。
代码实现:
#include<iostream>
using namespace std;
int a[10]={1,5,4,3,8,12,5,7,2,6};
int b[10]; //开辟辅助空间
int main()
{
int i=0,j=9;
for(int k=0;k<10;k++)
if(a[k]%2!=0) //奇数
b[i++]=a[k];
else
b[j--]=a[k];
//拷贝并输出
for(int k=0;k<10;k++)
{
a[k]=b[k];
cout<<a[k]<<" ";
}
return 0;
}
解法二:
用双指针,一个从前面开始找偶数,一个从后面开始往前找奇数,然后交换位置。
代码实现:
#include<iostream>
using namespace std;
int a[10]={1,5,4,3,8,12,5,7,2,6};
int main()
{
int i=0,j=9;
while(i<j)
{
while(a[i]%2!=0&&i<j)//从左边开始找偶数
i++;
while(a[j]%2==0&&i<j)//从右边开始找奇数
j--;
//交换位置
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
//打印数组
for(int k=0;k<10;k++)
cout<<a[k]<<" ";
return 0;
}
总结:
解法一是很容易想到的常规方法,方法二利用了快排的原理,不管是在空间上还是时间上都更加高效,更能启发人的思维。