首页 > 技术文章 > 调整输入数据数组顺序,奇数在前,偶数在后

shixisheng 2016-09-05 15:40 原文

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

方法一:最直接的办法是再写一个和原来数组大小相同的空间的数组,然后扫描两边数组,第一遍,如果是奇数,把数字放到新的数组中;第二遍,如果是偶数,把数组放到新的数组中。

#include "stdafx.h"

#include<vector>
#include <iostream>
using namespace  std;

//存放输入的数组
vector<int> arr;
//存放排序好的数组
vector<int> newarr;

//排序函数
void ReorderOddEven()
{
	
	int number;//存放读到的数字
        //此处有一个bug,当先输入一个空格在输入一个回车时,无法判断是回车
	while(cin.get()!='\n')//判断是否是回车键
	{

		cin.unget(); //如果发现不是回车,则把读到的数据放回去
                cin>>number; 
		arr.push_back(number);
	}
	int i=0;
	int  j=arr.size();
	for(int i=0;i<j;i++)
	{
		if (arr[i]%2==1)//判断,如果是奇数,则存到新的数组
			newarr.push_back(arr[i]);
	}

	for(int i=0;i<j;i++)
	{
		if (arr[i]%2==0)//判断,如果是偶数,则存到新的数组
			newarr.push_back(arr[i]);
	}
	
}

//输出排好序的数组
void printEven()
{
	int i;
	for(i=0;i<newarr.size();i++)
		cout<<newarr[i]<<" ";
}


int main()
{
	
	cout<<"请输入您要输入的序列"<<endl;
	ReorderOddEven ();
	cout<<"排好序的序列:"<<endl;
	 printEven();
	system("pause");
}
        

方法二:如果不考虑顺序问题的话,可以从两头向中间扫描,前后指针分别遇到偶数和奇数就停下来,然后交换他们。

#include "stdafx.h"

#include<vector>
#include <iostream>
using namespace  std;
vector<int> arr;
void ReorderOddEven()
{
	
	int number;
	while(number=cin.get()!='\n')
	{
		cin.unget(); 
        cin>>number; 
		arr.push_back(number);
	}
	int i=0;
	int  j=arr.size()-1;
	while(i<j)
	{
		
		while(i<j&&(arr[i]%2==1))
			i++;
		while(i<j&&(arr[j]%2==0))
			j--;
		swap(arr[i],arr[j]);
	}
}
void printEven()
{
	int i;
	for(i=0;i<arr.size();i++)
		cout<<arr[i]<<" ";
}


int main()
{
	
	vector<int> arr;
	cout<<"请输入您要输入的序列"<<endl;
	ReorderOddEven ();
	cout<<"排好序的序列:"<<endl;
	 printEven();
	system("pause");
}

  

推荐阅读