调整数组顺序使奇数位于偶数前面

Posted 做1个快乐的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调整数组顺序使奇数位于偶数前面相关的知识,希望对你有一定的参考价值。

调整数组顺序使奇数位于偶数前面(点击链接进入题目)

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

题目分析:针对本题,我们有不同的方法来解决,本题中保证奇数和偶数之间的相对位置不变是一个难点,读者们可以分别考虑两种情况:a-相对位置变化;b-相对位置不变。

法一:我们很容易想到的一个方法就是对数组进行遍历,此时借助一个辅助数组newarray,遍历第一遍数组找出奇数,挨个尾插到newarray中,然后再遍历一遍,找出所有的偶数依次尾插,但是该方法不管是空间复杂度还是时间复杂度都是不推荐的。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> newarray;
        //遍历第一遍找出所有的奇数
        for(const auto& val : array)
        {
            if(val % 2 != 0)
                newarray.push_back(val);
        }
        //遍历第二遍找出所有的偶数
        for(const auto& val : array)
        {
            if(val % 2 == 0)
                newarray.push_back(val);
        }
        //赋值重载
        array = newarray;
    }
};

法二:我们还是malloc一块和array大小一样的空间newarray,然后定义start和end两个变量,start指向array数组的头,end指向array的尾,让start从头找奇数,找到并从newarray的头依次向后插入,end从尾找偶数,找到并从newarray的尾依次向前插入。
start找奇数的过程如下:(部分)

end找偶数的过程如下:(部分)

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        //开辟和array大小一样的数组newarray
        vector<int> newarray(array.size());
        //定义start和end两个变量
        int start = 0;
        int end = array.size() - 1;
        //start从头部开始找奇数,并从newarray的头部依次向后插入
        int count = 0;
        while(start < array.size())
        {
            if(array[start] % 2 != 0)
                newarray[count++] = array[start];
            start++;
        }
        //end从尾部开始找偶数,并从newarray的尾部依次向前插入
        int sz = array.size();
        while(end >= 0)
        {
            if(array[end] % 2 == 0)
                newarray[--sz] = array[end];
            end--;
        }
        array = newarray;
    }
};

法三:借助法二的方法,我们还是定义end和start,不过这时start和end同时去找奇数和偶数,start从头找奇数,找到便停下,end从尾找偶数,找到便停下,然后交换start和end两个位置的值,循环下去,但是这种方法得到的数组奇数和偶数的相对位置发生变化了。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int start = 0;
        int end = array.size() - 1;
        while(start < end)
        {
            while(((start < end) && (array[start] & 1)))
                start++;
            while(((start < end) && !(array[end] & 1)))
                end--;
            swap(array[start], array[end]);
        }
    }
};

法四:要想保证相对位置不变,我们可以从前往后遍历数组,把偶数后移,腾出位置,放入奇数,即每找出一个奇数,把奇数前的位置全部后移一位,然后奇数插到最前面,奇数位置调整好之后,偶数位置自然就调整好了。

下图给了调整的两种情况的图:


class Solution {
public:
    void reOrderArray(vector<int> &array) {
    int k = 0;
    //遍历整个数组
    for(int i = 0; i < array.size(); ++i)
    {
        //找到奇数
        if(array[i] & 1)
        { 
            //从左向右,每次遇到的,都是最前面的奇数,一定将来要被放在k下标处
            int temp = array[i]; //现将当前奇数保存起来
            int j = i;
            while(j > k)
            { 
                //将该奇数之前的内容(偶数序列),整体后移一个位置
                array[j] = array[j-1];
                j--;
            }
            //将奇数保存在它将来改在的位置,因为我们是从左往右放的,没有跨越奇数,所以一定是相对位置不变的
            array[k++] = temp; 
        }
    }
    }
};

以上是关于调整数组顺序使奇数位于偶数前面的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer》题目:调整数组顺序使奇数位于偶数前面

代码的完整性:调整数组顺序使奇数位于偶数前面

数组:调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面

求调整数组顺序使奇数位于偶数前面

剑指Offer调整数组顺序使奇数位于偶数前面