【题解-信息学奥赛一本通】1181:整数奇偶排序

题目: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;
}

结果