奇偶排序
输入若干(不超过1000个)非负整数数字,请先取出为奇数的数字按从大到小排序,再取出偶数从小到大进行排序。
样例输入:12 34 5 7 92 3 8
样例输出:7 5 3 8 12 34 92
算法思路:分别从两端开始找到不符合奇偶的数,例如,左端找到偶数,右端找到奇数,两者交换,直到换完;再把左右两端数据分别排序。
第一轮:12 34 5 7 92 3 8,把这两个交换,变成了3 34 5 7 92 12 8;
第二轮:3 34 5 7 92 12 8,交换,得到:3 7 5 34 92 12 8;
交换完毕,用sort函数,分别排序,end。
学到的新知识:
①动态数组怎么判断输入流结束呢?就是在数字后面,【ctrl】和【z】同时按下,显示出来的效果是【^Z】,让输入停止
②输入结束的判断语句是while(cin>>a)
③swap函数、sort函数,头文件为<algorithm>
⑤greater、less函数,头文件为<functional>
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <functional> 5 6 using namespace std; 7 8 int main() 9 { 10 vector<int> data; 11 int a; 12 while(cin>>a) data.push_back(a); 13 14 int left=0, right=data.size()-1; 15 while(left <= right) 16 { 17 while( (left<=right) && data[left]%2 ) 18 left++; 19 if(left>right) break; 20 while( (left<=right) && !(data[right]%2) ) 21 right--; 22 if(left>right) break; 23 swap(data[left],data[right]); 24 } 25 26 //cout<<right<<endl; 27 int mid = right+1; 28 if(data[right+1]%2 == 0) mid-=1; 29 30 sort(data.begin(),data.begin()+mid+1,greater<int>()); 31 sort(data.begin()+mid+1,data.begin()+data.size(),less<int>()); 32 33 for(int i=0; i<data.size();++i) 34 { 35 cout<<data[i]<<" "; 36 } 37 cout<<endl; 38 39 //return 0; 40 }