【题解-信息学奥赛一本通】1177:奇数单增序列

题目:1177:奇数单增序列

题目描述:

给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。

输入:

第1行为 N;

第2行为 N 个正整数,其间用空格间隔。

输出:

增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。

时空限制

1s / 64 MB

样例输入:

复制代码
10
1 3 2 6 5 4 9 8 7 10

样例输出:

复制代码
1,3,5,7,9

代码1:快速排序

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=500+10;
int n,x,a[N],k;
void quick_sort(int l,int r){
	if(l>=r) return;
	int x=a[(l+r)/2];
	int i=l-1,j=r+1;
	while(i<j){
		do i++;while(a[i]<x);
		do j--;while(a[j]>x);
		if(i<j) swap(a[i],a[j]);
	}
	quick_sort(l,j);
	quick_sort(j+1,r);
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		if(x%2!=0) a[k++]=x;
	} 
	n=k;
	quick_sort(0,n-1);
	for(int i=0;i<n-1;i++) printf("%d,",a[i]);
	printf("%d",a[n-1]);
	return 0;
}

代码2:归并排序

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=500+10;
int n,x,a[N],k,tmp[N];
void merge_sort(int l,int r){
	if(l>=r) return;
	int mid=l+r >>1;
	merge_sort(l,mid);
	merge_sort(mid+1,r);
	int i=l,j=mid+1,k=0;
	while(i<=mid&&j<=r){
		if(a[i]<=a[j]) tmp[k++]=a[i++];
		else tmp[k++]=a[j++];
	}
	while(i<=mid) tmp[k++]=a[i++];
	while(j<=r) tmp[k++]=a[j++];
	for(int i=l,k=0;i<=r;i++,k++) a[i]=tmp[k];
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		if(x%2!=0) a[k++]=x;
	} 
	n=k;
	merge_sort(0,n-1);
	for(int i=0;i<n-1;i++) printf("%d,",a[i]);
	printf("%d",a[n-1]);
	return 0;
}

代码3:选择排序

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=500+10;
int n,x,a[N],k;
void select_sort(int l,int r){
	for(int i=0;i<n-1;i++){
		k=i;
		for(int j=i+1;j<n;j++)
			if(a[j]<a[k]) k=j;
		if(k!=i) swap(a[k],a[i]);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		if(x%2!=0) a[k++]=x;
	} 
	n=k;
	select_sort(0,n-1);
	for(int i=0;i<n-1;i++) printf("%d,",a[i]);
	printf("%d",a[n-1]);
	return 0;
}

代码4:冒泡排序

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=500+10;
int n,x,a[N],k;
void bubble_sort(int l,int r){
	bool f;
	for(int i=0;i<n-1;i++){
		f=true;
		for(int j=0;j<n-1-i;j++)
			if(a[j]>a[j+1]){
				swap(a[j],a[j+1]);
				f=false;
			} 
		if(f) break;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		if(x%2!=0) a[k++]=x;
	} 
	n=k;
	bubble_sort(0,n-1);
	for(int i=0;i<n-1;i++) printf("%d,",a[i]);
	printf("%d",a[n-1]);
	return 0;
}

代码5:插入排序

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=500+10;
int n,x,a[N],k;
void insert_sort(int l,int r){
	for(int i=1;i<n;i++){
		int key=a[i];
		int j=i-1;
		while(j>=0&&a[j]>key){
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=key;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		if(x%2!=0) a[k++]=x;
	} 
	n=k;
	insert_sort(0,n-1);
	for(int i=0;i<n-1;i++) printf("%d,",a[i]);
	printf("%d",a[n-1]);
	return 0;
}

结果