输入
4 7 3 13 11 12 0 47 34 98
输出
47 13 11 7 3 0 4 12 34 98
【提交地址】
题目分析
关键是找到交换位序的逻辑,有如下几种情况:
- 左值为奇数,右值为偶数 => 不需要交换
- 左值为偶数,右值为奇数 => 需要交换
- 左值和右值同为奇数 => 从大到小排列
- 左值和右值同为偶数 => 从小到大排列
在需要交换时提供false即可:
bool comp(int lhs, int rhs){
//不发生交换的条件先返回真
if (lhs%2==1&&rhs%2==0){//左值为奇数,右值为偶数 => 不需要交换
return true;
}else if(lhs%2==0&&rhs%2==0&&lhs<rhs){//左值和右值同为偶数 => 从小到大排列
return true;
}else if(lhs%2==1&&rhs%2==1&&lhs>rhs){//左值和右值同为奇数 => 从大到小排列
return true;
}else{return false;}
}
代码
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
bool comp(int lhs, int rhs){
//不发生交换的条件先返回真
if (lhs%2==1&&rhs%2==0){
return true;
}else if(lhs%2==0&&rhs%2==0&&lhs<rhs){
return true;
}else if(lhs%2==1&&rhs%2==1&&lhs>rhs){
return true;
}else{return false;}
}
int main() {
int arr[10];
while(scanf("%d%d%d%d%d%d%d%d%d%d",
arr,arr+1,arr+2,arr+3,arr+4,arr+5,arr+6,arr+7,arr+8,arr+9)
!= EOF){
sort(arr,arr+10,comp);
for (int i = 0; i < 10; ++i) {
printf("%d ",arr[i]);
}
printf("\n");
}
return 0;
}
思路总结
针对所有排序类题目,首先需要找到关键的比较和交换操作,列出所有不会发生交换的情形,设置一个bool函数在不会交换的条件下返回true,其他的条件返回false,然后传参给sort即可。