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

/*
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
*/
class Solution{
public:
	void reOrderArray(vector<int> &array) {
        /*
        if(array.size() == 0 || array.size() == 1) return ;
        
        std::vector<int> arr_temp ;
        arr_temp.reserve(array.size() >> 1) ;// 数组预留
        std::vector<int>::iterator it = array.begin() ;
        for(; it != array.end();) {
            if((*it & 0x1) == 0) {// 偶数抽出来   存入临时数组
                arr_temp.push_back(*it) ;
                it = array.erase(it) ;// 原数组偶数被删除掉
            }else {
                ++it ;
            }
        }
        it = arr_temp.begin() ;
        for(; it != arr_temp.end(); ++it) {
            array.push_back(*it) ;// 原数组加入偶数
        }*/
        
        // 没办法 要保证次序  只能相邻交换或者顺次交换
        int nLen = array.size() ;
        if(nLen == 0 || nLen == 1) return ;
        int nCurEvenIndex = 0 ;
        while(nCurEvenIndex < nLen) {
            if((array[nCurEvenIndex] & 0x1) == 0) {
                int nOddIndex = nCurEvenIndex + 1 ;
                bool bFindOdd = false ;
                while(nOddIndex < nLen) {
                    if((array[nOddIndex] &0x1) == 0x1) {
                        bFindOdd = true ;
                        int nTemp = array[nOddIndex] ;
                        for(int i = nOddIndex; i > nCurEvenIndex; --i) {
                            array[i] = array[i - 1] ;
                        }
                        array[nCurEvenIndex] = nTemp ;
                        break ;
                    }else {
                        ++nOddIndex ;
                    }
                }
                if(bFindOdd) {
                    ++nCurEvenIndex ;// 不能 nCurEvenIndex = nOddIndex + 1  因为后面的Odd还要顺次替换前面的偶数
                }else {
                    return ;
                }
            }else {
                ++nCurEvenIndex ;
            }
        }
        
        //
        /*  类似于快排 但是不满足稳定性  仅作参考意义
        int nLen = array.size() ;
        if(nLen == 0 || nLen == 1) return ;
        int nFromHead = 0 ;
        int nFromTail = nLen - 1 ;
        while(nFromTail > nFromHead) {
            while(nFromTail > nFromHead && (array[nFromHead] & 0x1) == 0x1)
                ++nFromHead ;
            while(nFromTail > nFromHead && (array[nFromTail] & 0x1) == 0x0)
                --nFromTail ;
            if(nFromTail > nFromHead) {
                int nTemp = array[nFromTail] ;
                array[nFromTail] = array[nFromHead] ;
                array[nFromHead] = nTemp ;
            }
        }*/
	}
} ;





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值