调整数组-奇数在左偶数在右

问题描述:

将一个整型数组的奇数移到最左边,偶数移到最右边,要求时间复杂度为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;
}

总结:
解法一是很容易想到的常规方法,方法二利用了快排的原理,不管是在空间上还是时间上都更加高效,更能启发人的思维。

发布了33 篇原创文章 · 获赞 27 · 访问量 74

猜你喜欢

转载自blog.csdn.net/weixin_46165788/article/details/105528790