九度oj 题目1516:调整数组顺序使奇数位于偶数前面

题目1516:调整数组顺序使奇数位于偶数前面

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:3407

解决:1085

题目描述:

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

 

输入:

每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。

 

输出:

对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。

 

样例输入:
5
1 2 3 4 5
样例输出:
1 3 5 2 4

分析:首先如果不考虑相对位置不变的话,这道题很好解决:设置两个指针,像快排一样,一个指针i指向头,一个j指向尾,i指向的元素
为偶,并且j指向的元素为奇,则两个数交换,直到i >= j
 1 #include <iostream>
 2 #include <vector>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int main(){
 8     vector<int> v;
 9     int n, temp, i, j;
10     while(scanf("%d", &n) != EOF){
11         v.clear();
12         for(i = 0; i < n; i++) {
13             scanf("%d", &temp);
14             v.push_back(temp);
15         }
16         i = 0, j = n - 1;
17         while(i < j) {
18             while(i < j && (v[i] % 2 == 1)) {i++;}
19             while(i < j && (v[j] % 2 == 0)) {j--;}
20             swap(v[i], v[j]);
21         }
22         printf("%d", v[0]);
23         for(int k = 1; k < n; k++)
24             printf(" %d", v[k]);
25         printf("\n");
26     }
27     return 0;
28 }

考虑相对位置的话,解法一(完全是为了ac):以空间换时间,建两个vector容器,一个装奇数,一个装偶数,最后再按照格式输出即可;

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 
 6 int main(){
 7     vector<int> v, v_even, v_odd;
 8     int n, temp;
 9     while(cin >> n) {
10         for(int i = 0; i < n; i++) {
11             cin >> temp;
12             if(temp & 1 ==1)
13                 v_even.push_back(temp);
14             else
15                 v_odd.push_back(temp);
16         }
17         if(v_even.size() != 0)
18             cout << v_even[0];
19         for(i = 1; i < v_even.size(); i++)
20             cout << " " << v_even[i]; 
21         if(v_odd.size() != 0)
22             cout << v_odd[0];
23         for(i = 1; i < v_odd.size(); i++)
24             cout << " " << v_odd[i];
25         cout << endl; 
26     }
27     return 0;
28 }

解法三:不改变相对位置,那么设计的算法应该是稳定的,稳定的排序算法,且复杂度低的有归并排序,所以用归并排序:

 

 

转载于:https://www.cnblogs.com/qinduanyinghua/p/6435604.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值