剑指offer题目 调整数组顺序使奇数位于偶数前面

题目描述

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

这道题目最简单的做法扫一遍数组,遇到偶数直接删除,在添加到数组尾部,这样做的时间复杂度是O(n^2)

当然还可以在开辟一个额外的空间,遍历两次,分别处理奇数和偶数,这样的时间复杂度是O(n), 空间复杂度是O(n)

一个经典的做法是用快排的双指针思想,通过双指针操作实现,但这个过程是不稳定的,不能保证数组的稳定性

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int left = 0, right = array.size()-1;
        while(left<=right){
            while(left<=right && array[left]%2==1) left++;
            while(left<=right && array[right]%2==0) right--;
            if(left<right) swap(array[left],array[right]);
        }
    }
};

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/90045238