排序问题在机试中经常考到,这时候就可以用C++中的排序函数sort(first,last,comp)其中first,last为首地址和末尾地址,comp为比较函数(可填可不填)如果不填写默认升序,在用到这个函数时,需要引进一个头文件#include<algorithm>其中有很多有用的函数不再需要自己实现
KY210 排序
描述
对输入的n个数进行排序并输出。
输入描述:
输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。 每组测试数据的结果占一行。
示例1
输入:
4 1 4 3 2
复制输出:
1 2 3 4
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[200] = {0};
int n;
while(cin>>n){
for(int i = 0; i < n; i++){
cin>>a[i];
}
sort(a,a + n);
for(int i = 0; i < n; i++)
cout<<a[i]<<' ';
printf("\n");
}
}
也可以自定义排序函数如该题:
KY9 成绩排序
描述
用一维数组存储学号和成绩,然后,按成绩排序输出。
输入描述:
输入第一行包括一个整数N(1<=N<=100),代表学生的个数。 接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。
输出描述:
按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。 如果学生的成绩相同,则按照学号的大小进行从小到大排序。
示例1
输入:
3 1 90 2 87 3 92
复制输出:
2 87 1 90 3 92
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct student{
int id;
int score;
};
bool comp(student x, student y){ //comp函数的法则:当比较函数返回的是true时第一个参数排在第二个参数前
if(x.score == y.score){
return x.id < y.id;
}else{
return x.score < y.score;
}
}
int main(){
student ss[200];
int n;
cin>>n;
for(int i = 0; i < n; i++){
scanf("%d %d", &ss[i].id, &ss[i].score);
}
sort(ss,ss + n,comp);
for(int i = 0; i < n; i++){
printf("%d %d\n", ss[i].id, ss[i].score);
}
return 0;
}
KY2 成绩排序
描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
输入描述:
注意一个case里面有多组样例,请用循环处理输入 输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1
输入:
3 0 fang 90 yang 50 ning 70
复制输出:
fang 90 ning 70 yang 50
复制
示例2
输入:
3 1 fang 90 yang 50 ning 70 3 0 moolgouua 43 aebjag 87 b 67
复制输出:
yang 50 ning 70 fang 90 aebjag 87 b 67 moolgouua 43
复制说明:
第一组用例: 3 1 fang 90 yang 50 ning 70 升序排序为: yang 50 ning 70 fang 90 第二组降序为: aebjag 87 b 67 moolgouua 43
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
string name;
int score;
int order;//次序
};
bool comp1(student x, student y){ // 升序排列
if(x.score == y.score){
return x.order < y.order;
}else{
return x.score < y.score;
}
}
bool comp2(student x, student y){ // 降序排列
if(x.score == y.score){
return x.order < y.order;
}else{
return x.score > y.score;
}
}
int main(){
int n = 0, type = -1;
while(scanf("%d%d", &n, &type) != EOF){
student ss[n];
for(int i = 0; i < n; ++i){
cin>>ss[i].name>>ss[i].score;
ss[i].order = i;
}
if(type == 0){
sort(ss, ss + n, comp2);
}else{
sort(ss, ss + n, comp1);
}
for(int i = 0; i < n; ++i){
cout << ss[i].name << ' ' << ss[i].score << endl;
}
}
}
注意:次序问题只需在结构体中再添加1次序成员order将每个数据的次序记录下来即可,然后compare函数中如果成绩相等比较次序,如果成绩不等则比较成绩即可。
KY211 特殊排序
描述
输入一系列整数,将其中最大的数挑出(如果有多个,则挑出一个即可),并将剩下的数进行排序,如果无剩余的数,则输出-1。
输入描述:
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。 接下来的一行有N个整数。
输出描述:
可能有多组测试数据,对于每组数据, 第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。 第二行将排序的结果输出。
示例1
输入:
4 1 3 4 2
复制输出:
4 1 2 3
一开始没有看到只挑出一个,想的复杂了一些,用一个辅助数组,将所有的最大值都给去除了,所以一开始没有A;
//这是最开始将所有最大值都给去除了的代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n, arr[1002], res[1002], max = 0;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d",&arr[i]);
}
max = arr[0];
for(int i = 1; i < n; i++){
if(max < arr[i])
max = arr[i];
}
sort(arr, arr + n);
int j = 0;
for(int i = 0; i < n; i++){
if(arr[i] != max){
res[j] = arr[i];
j++;
}
}
printf("%d", max);
for(int i = 0; i < j; ++i){
printf("%d ", res[i]);
}
}
}
//这是只去除其中之一的代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n, arr[1002], max = 0;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d",&arr[i]);
}
max = arr[0];
sort(arr, arr + n);
printf("%d\n", arr[n-1]);
n--;
if(n == 0){
printf("-1\n");
}else{
for(int i = 0; i < n; ++i){
printf("%d ", arr[i]);
}
}
}
}