题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:最直接的办法是再写一个和原来数组大小相同的空间的数组,然后扫描两边数组,第一遍,如果是奇数,把数字放到新的数组中;第二遍,如果是偶数,把数组放到新的数组中。
#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"); }