剑指offer刷题之c++实现的调整数组顺序使奇数位于偶数前面

#include "myHead.h" 
/**
调整数组顺序,使得奇数全部放左边,偶数全部放右边,不考虑原来数组中的奇(偶)数之间相对顺序 
*/
int condition(int x); 
 void reOrderArray(vector<int> &array) {
        int i = 0,j=array.size()-1,temp;
        while(i<j){
            while(i<j && condition(array[i]) )
                i++;
            while(i<j && !condition(array[j]))
                j--;
            if(i<j){
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
                
            }
        }
    }
    //求奇数偶数,用位运算加速 
    int condition(int x){
        return x&1;
    }
    
    int main(){
    	vector<int> pre;		
		pre.push_back(1);
		pre.push_back(2); 
		pre.push_back(3);
		pre.push_back(4);
		pre.push_back(5);
		pre.push_back(6);
		pre.push_back(7);		
		cout<<"before: ";
		for(vector<int>::iterator it=pre.begin();it<pre.end();++it){
			  cout<<*it<<" ";
		}
		
		reOrderArray(pre);
		
		cout<<endl<<"after: ";
		for(vector<int>::iterator it=pre.begin();it<pre.end();++it){
			  cout<<*it<<" ";
		}
		return 1;
    }


拓展,在上题条件的基础上,保持原来数组的奇数之间和偶数之间的相对顺序。


#include "myHead.h" 
/**
奇数全部放左边,偶数全部放右边,但是考虑原来数组中的奇(偶)数之间相对顺序 ,让他们继续相对顺序保持不变 
*/
int condition(int x); 
 void reOrderArray(vector<int> &array) {
        int i = 0,j=array.size()-1,temp;
       	vector<int> a,b;
        while(i<j){
        	
            if(i<j && condition(array[i]) ){
                a.push_back(array[i]);
				
            }
	        else{
	    		b.push_back(array[j]);      	
	        }
              i++;             
        }
        while(!b.empty()){
        	array.push_back(b.pop_back());
        }
        while(!a.empty()){
        	array.push_back(a.pop_back());
        }
    }
    //求奇数偶数,用位运算加速 
    int condition(int x){
        return x&1;
    }
    
    int main(){
    	vector<int> pre;		
		pre.push_back(1);
		pre.push_back(2); 
		pre.push_back(3);
		pre.push_back(4);
		pre.push_back(5);
		pre.push_back(6);
		pre.push_back(7);		
		cout<<"before: ";
		for(vector<int>::iterator it=pre.begin();it<pre.end();++it){
			  cout<<*it<<" ";
		}
		
		reOrderArray(pre);
		
		cout<<endl<<"after: ";
		for(vector<int>::iterator it=pre.begin();it<pre.end();++it){
			  cout<<*it<<" ";
		}
		return 1;
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值