题目:1181:整数奇偶排序
题目描述:
给定10个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后;
2.奇数按从大到小排序;
3.偶数按从小到大排序。
输入:
输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于30000。
输出:
按照要求排序后输出一行,包含排序后的10个整数,数与数之间以一个空格分开。
时空限制
1s / 64 MB
样例输入:
4 7 3 13 11 12 0 47 34 98
样例输出:
47 13 11 7 3 0 4 12 34 98
代码1:快速排序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10+10;
int n=10,x,el=0,sr=9;
int s[N];
bool cmp(int x,int y,int id){
if(id) return x>y;
return x<y;
}
void quick_sort(int l,int r,int id){
if(l>=r) return;
int x=s[(l+r)/2];
int i=l-1,j=r+1;
while(i<j){
do i++;while(cmp(s[i],x,id));
do j--;while(cmp(x,s[j],id));
if(i<j) swap(s[i],s[j]);
}
quick_sort(l,j,id);
quick_sort(j+1,r,id);
}
int main(){
for(int i=0;i<n;i++){
cin>>x;
if(x%2) s[el++]=x;
else s[sr--]=x;
}
quick_sort(0,el-1,1);
quick_sort(sr+1,n-1,0);
for(int i=0;i<n;i++) cout<<s[i]<<" ";
return 0;
}
代码2:归并排序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10+10;
int n=10,x,el=0,sr=9;
int s[N],tmp[N];
bool cmp(int x,int y,int id){
if(id) return x>y;
return x<y;
}
void merge_sort(int l,int r,int id){
if(l>=r) return;
int mid=l+r >>1;
merge_sort(l,mid,id);
merge_sort(mid+1,r,id);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(cmp(s[i],s[j],id)) tmp[k++]=s[i++];
else tmp[k++]=s[j++];
}
while(i<=mid) tmp[k++]=s[i++];
while(j<=r) tmp[k++]=s[j++];
for(int i=l,k=0;i<=r;i++,k++) s[i]=tmp[k];
}
int main(){
for(int i=0;i<n;i++){
cin>>x;
if(x%2) s[el++]=x;
else s[sr--]=x;
}
merge_sort(0,el-1,1);
merge_sort(sr+1,n-1,0);
for(int i=0;i<n;i++) cout<<s[i]<<" ";
return 0;
}
代码3:选择排序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10+10;
int n=10,x,el=0,sr=9;
int s[N];
bool cmp(int x,int y,int id){
if(id) return x>y;
return x<y;
}
void select_sort(int l,int r,int id){
for(int i=l;i<r;i++){
int k=i;
for(int j=i+1;j<=r;j++)
if(cmp(s[j],s[k],id)) k=j;
if(k!=i) swap(s[i],s[k]);
}
}
int main(){
for(int i=0;i<n;i++){
cin>>x;
if(x%2) s[el++]=x;
else s[sr--]=x;
}
select_sort(0,el-1,1);
select_sort(sr+1,n-1,0);
for(int i=0;i<n;i++) cout<<s[i]<<" ";
return 0;
}
代码4:冒泡排序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10+10;
int n=10,x,el=0,sr=9;
int s[N];
bool cmp(int x,int y,int id){
if(id) return x>y;
return x<y;
}
void bubble_sort1(int l,int r,int id){
int n=r-l+1;
bool f;
for(int i=0;i<n-1;i++){
f=true;
for(int j=l;j<n-1-i;j++)
if(cmp(s[j+1],s[j],id)){
swap(s[j],s[j+1]);
f=false;
}
if(f) break;
}
}
void bubble_sort2(int l,int r,int id){
int n=r-l+1;
bool f;
for(int i=0;i<n-1;i++){
f=true;
for(int j=l;j<l+n-1-i;j++)
if(cmp(s[j+1],s[j],id)){
swap(s[j],s[j+1]);
f=false;
}
if(f) break;
}
}
int main(){
for(int i=0;i<n;i++){
cin>>x;
if(x%2) s[el++]=x;
else s[sr--]=x;
}
bubble_sort1(0,el-1,1);
bubble_sort2(sr+1,n-1,0);
for(int i=0;i<n;i++) cout<<s[i]<<" ";
return 0;
}
代码5:插入排序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10+10;
int n=10,x,el=0,sr=9;
int s[N];
bool cmp(int x,int y,int id){
if(id) return x>y;
return x<y;
}
void insert_sort(int l,int r,int id){
for(int i=l+1;i<=r;i++){
int key=s[i];
int j=i-1;
while(j>=l&&cmp(key,s[j],id)){
s[j+1]=s[j];
j--;
}
s[j+1]=key;
}
}
int main(){
for(int i=0;i<n;i++){
cin>>x;
if(x%2) s[el++]=x;
else s[sr--]=x;
}
insert_sort(0,el-1,1);
insert_sort(sr+1,n-1,0);
for(int i=0;i<n;i++) cout<<s[i]<<" ";
return 0;
}
代码6:计数排序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=30000+10;
int n=10;
int x,s[N];
int main(){
for(int i=0;i<n;i++){
cin>>x;
s[x]++;
}
for(int i=30000-1;i>=1;i-=2)
if(s[i])
while(s[i]--) cout<<i<<" ";
for(int i=0;i<=30000;i+=2)
if(s[i])
while(s[i]--) cout<<i<<" ";
return 0;
}
结果
