剑指offer- 调整数组顺序使奇数位于偶数前面(数组)

题目描述

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

看着这个题目,想到的是排序算法。(推荐这个)

以及利用空间换时间,新建数组的算法。

先说这个新建数组的算法,思路简单。就是将奇数和偶数分别计算出来放在新的数组里,再把新的数组给旧数组。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> a,b;
        for(int i=0;i<array.size();i++)
        {
            if(array[i]%2!=0)
                a.push_back(array[i]);
            else
                b.push_back(array[i]);
        }
        a.insert(a.end(),b.begin(),b.end());
        array=a;
    }
};

这里时间复杂度是O(n),空间复杂度也是O(n)。就是利用消耗空间来换取时间。但是后来想到,既然题目用到了引用,应该是希望我们尽量在原数组array上进行修改,所以比较推荐排序算法。

方法二:插入排序

题目中提到相对位置不变,因此考虑用的是插入排序的思想。

当这个数是奇数时,记录在temp中,如果前面有偶数,就往这个数前插入。这样也能保持了原本的顺序

这个时间复杂度O(n^2),空间复杂度是O(1)。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        for(int i=1;i<array.size();i++)
        {
            if(array[i]%2==1){
                int temp = array[i];
                int j;
                for(j=i;j>0&&array[j-1]%2==0;j--)
                    array[j]=array[j-1];
                array[j]=temp;
            }
        }
    }
};

后来想到好像还可以用,检测这个数是否偶数,是偶数就先在数组中删除,再在末尾push_back。没有具体测试过,在Python上应该比较好实现。

猜你喜欢

转载自blog.csdn.net/Mr_xuexi/article/details/84314836