Bootstrap

C++剑指offer——调整数组顺序使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解法

解法一
1、先统计奇数的个数,假设为n个,再创建一个同样大小的数组arry。
2、用两个指针low,high指向新开的数组。分别是low=0和high=n
3、遍历原数组,若当前元素为奇数则arr[low++]=array[i];否则,arr[high++]=array[i]。
4、最后把新数组的值依次赋值给原数组
时间复杂度:O(N)。
空间复杂度:O(N)。
代码:

class Solution {
public:
    void reOrderArray(vector<int> &array) 
    {
        int size=array.size();
        int arr[size];
        int oddnum=0;
        for(int i=0;i<array.size();i++)
            if(array[i]%2==1)
                oddnum++;
        int low=0;
        int high=oddnum;
        for(int i=0;i<array.size();i++)
        {
            if(array[i]%2==1)
                arr[low++]=array[i];
            else
                arr[high++]=array[i];
        }
        for(int i=0;i<size;i++)
            array[i]=arr[i];
    }
};

解法二
参考快速排序
i++往前走碰到偶数停下来,j = i+1
若 a[j]为偶数,j++前进,直到碰到奇数
a[j]对应的奇数插到a[i]位置,j经过的j-i个偶数依次后移
如果j==len-1时还没碰到奇数,证明i和j之间都为偶数了,完成整个移动
在这里插入图片描述
代码:

class Solution {
public:
    void reOrderArray(vector<int> &array) 
    {
        int len = array.size();
        if(len <= 1)
            return;

        int i = 0;
        while(i < len)
        {
            int j = i + 1;
            if(array[i]%2 == 0)
            { // a[i]为偶数,j前进,直到替换
                while(array[j]%2 == 0)
                { // j为偶数,前进
                    if(j==len-1)// i为偶数,j也为偶数,一直后移到了末尾,证明后面都是偶数
                         return;
                    j++;
                }
                // 此时j为奇数
                int count = j-i;
                int temp = array[i];
                array[i] = array[j];
                while(count>1)
                {
                    array[i+count] = array[i+count-1];//数组后移
                    count--;
                }
                array[i+1] = temp;
            }
            i++;
        }   
    }
};
;