杭厦地区实习生机考体验测试2015(奇偶排序)

奇偶排序

输入若干(不超过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 }

 

posted on 2015-04-01 12:52  夏大兔  阅读(176)  评论(0编辑  收藏  举报

导航