题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:最直接的办法是再写一个和原来数组大小相同的空间的数组,然后扫描两边数组,第一遍,如果是奇数,把数字放到新的数组中;第二遍,如果是偶数,把数组放到新的数组中。
#include "stdafx.h"
#include<vector>
#include <iostream>
using namespace std;
//存放输入的数组
vector<int> arr;
//存放排序好的数组
vector<int> newarr;
//排序函数
void ReorderOddEven()
{
int number;//存放读到的数字
//此处有一个bug,当先输入一个空格在输入一个回车时,无法判断是回车
while(cin.get()!='
')//判断是否是回车键
{
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()!='
')
{
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");
}