题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:
其实该题目是一道排序题,由于题目要求相对位置不变,因此我们需要使用稳定的排序算法,插入排序或者冒泡排序
插入排序,就是每次扫描到奇数时,就把它插入到上一个奇数的后面,因此,需要将这一节的偶数整体向后移动,时间复杂度为O(n^2)
冒泡排序即每次遇到偶数在前奇数在后的情况,就交换两者的位置,时间复杂度也为O(n^2)
也可以牺牲空间换取时间,定义一个数组,如果遇到奇数原数组不变,如果遇到偶数,将该数插入到新数组中,然后从原数组移除该元素,最后将新数组拼接在原数组后面
如果改题目不要求相对位置,那么我们就可以使用快排的思想来做
C++实现插入排序思想:
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int odd = -1;//奇数指针
        int temp;
        for(int i=0;i<array.size();i++){
            if(array[i] % 2 == 1){
                temp = array[i];
                for(int j=i;j> odd+1;j--){
                    array[j] = array[j-1];
                }
                array[++odd] = temp;
            }
            
        }
    }
};

 java实现冒泡排序算法;

public class Solution {
    public void reOrderArray(int [] array) {
        boolean swap = true;
        int tmp;
        int len = array.length;
        for(int i = 0;i<len;i++){
            if(swap == false)
                break;
            swap = false;
            for(int j = 0;j<len-i-1;j++){
                
                if(array[j]%2==0 && array[j+1]%2==1){
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    swap = true;
                }
            }
        }
    }
}

 评论区大神使用c++ STL库的stable_partition函数

class Solution {
public:
    bool static isOdd(int n){
        return n%2==1;
    }
    void reOrderArray(vector<int> &array) {
        stable_partition(array.begin(),array.end(),isOdd);
    }
};

stable_partition函数介绍:

 双指针法:

class Solution {
public:
    
    vector<int> exchange(vector<int>& nums) {
        int n = nums.size();
        int left = 0,right = n-1;
        while(left<right){
            while(left<right&&nums[left]&1)//奇数
                left++;
            while(left<right&&!(nums[right]&1))//偶数
                right--;
            swap(nums[left++],nums[right--]);
        }
        return nums;
    }
};

 

 

 

 

posted on 2020-08-20 21:46  曹婷婷  阅读(146)  评论(0编辑  收藏  举报