【题目链接】
ybt 1181:整数奇偶排序
OpenJudge NOI 1.10 06:整数奇偶排序
【题目考点】
1. 排序
【解题思路】
解法1:将奇数和偶数分开,分别排序
将奇数和偶数分别存在两个不同的数组中,奇数降序排序,偶数升序排序,分别排序输出。
解法2:整合为一个比较条件
设函数判断两个数字哪个应该排在前面
- 如果一个是奇数一个是偶数,奇数排在前面
- 如果都是奇数,更大的排在前面
- 如果都是偶数,更小的排在前面
这样就得到了一个比较条件。用这个比较条件去做排序即可。
数据只有10个,用什么排序方法都可以。
【题解代码】
解法1:将奇数和偶数分开,分别排序
- 使用STL sort函数排序
#include <bits/stdc++.h>
using namespace std;
bool cmpUp(int a, int b)//升序
{
return a < b;
}
bool cmpDown(int a, int b)//降序
{
return a > b;
}
int main()
{
int a, odd[15], even[15], oi = 0, ei = 0;//oi:odd中元素个数 ei:even中元素个数
for(int i = 1; i <= 10; ++i)
{
cin >> a;
if(a%2 == 0)
even[++ei] = a;//填充数组
else
odd[++oi] = a;
}
sort(odd+1, odd+1+oi, cmpDown);//奇数降序排序
sort(even+1, even+1+ei, cmpUp);//偶数升序排序
for(int i = 1; i <= oi; ++i)
cout << odd[i] << ' ';
for(int i = 1; i <= ei; ++i)
cout << even[i] << ' ';
return 0;
}
- 插入排序
#include <bits/stdc++.h>
using namespace std;
bool cmpUp(int a, int b)//升序
{
return a < b;
}
bool cmpDown(int a, int b)//降序
{
return a > b;
}
int main()
{
int a, odd[15], even[15], oi = 0, ei = 0;//oi:odd中元素个数 ei:even中元素个数
for(int i = 1; i <= 10; ++i)
{
cin >> a;
if(a%2 == 0)
{
even[++ei] = a;//填充数组
for(int j = ei; j > 1; --j)
{
if(even[j] < even[j-1])//偶数升序排序
swap(even[j], even[j-1]);
else
break;
}
}
else
{
odd[++oi] = a;
for(int j = oi; j > 1; --j)
{
if(odd[j] > odd[j-1])//奇数降序排序
swap(odd[j], odd[j-1]);
else
break;
}
}
}
for(int i = 1; i <= oi; ++i)
cout << odd[i] << ' ';
for(int i = 1; i <= ei; ++i)
cout << even[i] << ' ';
return 0;
}
解法2:整合为一个比较条件
- 使用STL sort函数
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a, int b)//返回a排在前面的条件
{
if(a%2 == 1 && b%2 == 1)//如果都是奇数,更大的排在前面
return a > b;
else if(a%2 == 0 && b%2 == 0)//如果都是偶数,更小的排在前面
return a < b;
else//如果一个是奇数一个是偶数,奇数排在前面
return a%2 == 1;//如果a为奇数 a在前面。如果a不是奇数,那么b为奇数,a不能排在前面。
}
int main()
{
int a[15];
for(int i = 1; i <= 10; ++i)
cin >> a[i];
sort(a+1, a+1+10, cmp);
for(int i = 1; i <= 10; ++i)
cout << a[i] << ' ';
return 0;
}
- 使用选择排序
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a, int b)//返回a排在前面的条件
{
if(a%2 == 1 && b%2 == 1)//如果都是奇数,更大的排在前面
return a > b;
else if(a%2 == 0 && b%2 == 0)//如果都是偶数,更小的排在前面
return a < b;
else//如果一个是奇数一个是偶数,奇数排在前面
return a%2 == 1;//如果a为奇数 a在前面。如果a不是奇数,那么b为奇数,a不能排在前面。
}
int main()
{
int a[15];
for(int i = 1; i <= 10; ++i)
cin >> a[i];
for(int i = 1; i <= 9; ++i)
for(int j = i+1; j <= 10; ++j)
if(cmp(a[j], a[i]))//如果a[j]应该在a[i]前面
swap(a[j], a[i]);
for(int i = 1; i <= 10; ++i)
cout << a[i] << ' ';
return 0;
}