算法学习记录十一(C++)--->调整数组顺序使奇数前偶数后

描述

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

分析

方法1:冒泡排序调换(只是条件变成了奇数和偶数互换)
方法2:临时数组存储(开启临时数组存储偶数,然后原数组删除偶数,最后进行push_back)
方法3:指针调换(该方法不能保证数组的奇偶的相对位置)

方法1

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        for(int i = 0; i<array.size();i++){
            bool isSwap = false;
            for(int j = array.size()-1;j>i;j--){
            // 奇数和偶数调换
                if(array[j]%2==1&&array[j-1]%2==0){
                    swap(array[j],array[j-1]);
                    isSwap = true;
                }
            }
            if(!isSwap){
                break;
            }
        }
    }
};

方法2

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        // 创建存储偶数的临时数组
       vector<int> array_temp;
        // 迭代遍历初始值指针变量
        // vector<int>::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
       vector<int> ::iterator begin1;
        // 指向第一个值
        begin1 = array.begin();
        // 遍历查找出偶数 然后放入临时数组
        for(;begin1!=array.end();){
            if(*begin1 % 2 == 0){
                // 偶数加入临时数组
                array_temp.push_back(*begin1);
                // 原数组移除指定的偶数 不需要进行+1
                begin1 = array.erase(begin1);
            }
            else
            {
                begin1++;
            }
        }

        vector<int>::iterator begin2,end2;
        begin2 = array_temp.begin();
        end2 = array_temp.end();
        // 临时数组拼接到原数组后面
        for(;begin2!=end2;begin2++)
            {
            array.push_back(*begin2);
        }

    }
};

注:对应的erase()方法参考链接传送门

方法3(不能保证相对位置,参考一下)

// 这种方法交换的确很快速,但是这种方式不能保证奇数和偶数的相对位置
// 例如 1234567 ---> 1735462  但是结果需要的输出是保证相对位置不变 1357246  
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> ::iterator left = array.begin();
        vector<int> ::iterator right = array.end()-1;
        while(left<right){
            // 指向第一个偶数
            while(left<right && (*left && 0x01)==1){
                left++;
            }
            // 指向第一个奇数
            while(left<right && (*right && 0x01)==0){
                right--;
            }
            if(left<right){
                swap(*left,*right);
            }
        }


    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值