您的位置:首页 > 编程语言 > C语言/C++

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

2015-08-08 12:22 801 查看
#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;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: