欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sort排序

程序员文章站 2024-02-23 09:56:16
...

将n个实数从小到大排序。

//sort会根据数据情况自动选择适合的排序方式,数据多可能采用快排,数据少可能采用其他排序方式;默认为从小到大排序

#include<algorithm>
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%lf",a+i);
sort(a,a+n); 

将n个实数从大到小排序。

bool cmp(double x, double y){ //比较函数cmp中,x、y为排序数据a数组中的任意两个元素,函数用来指定排序规则
  return x>y; //指定为从大到小排序规则
}
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%lf",a+i);
sort(a,a+n,cmp);  //加入比较函数 cmp

1176:谁考了第k名

【题目描述】
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
【输入】
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。
其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。

【输出】
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
【输入样例】
5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9
【输出样例】
90788004 68.4

//要排序的数据中有多个字段的时候需要用到结构数组来将要排序的字段包含在自定义类型中,这样在需要交换数据的时候,某条数据下的多个字段会同时进行数据的交换

struct st{ 
  int No;
  double s;
};
bool cmp( st x, st y){
  return x.s>y.s;
}
int main(){
  st a[105];
  int i,n,k;
  scanf("%d%d",&n,&k);
  for(i=0;i<n;i++)scanf("%d%lf",&a[i].No,&a[i].s);
  sort(a,a+n,cmp);
  printf("%d %g",a[k-1].No, a[k-1].s);

sort(a+1,a+1+n,cmp) //表示对a[1]到a[n]的数据按照cmp的规则进行排序

1179:奖学金
【题目描述】
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
【输入】
包含n+1行:
第1行为一个正整数n(小于300),表示该校参加评选的学生人数。
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n (恰好是输入数据的行号减1)。
【输出】
共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
【输入样例】
6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
【输出样例】
6 265
4 264
3 258
2 244
1 237
【提示】
样例输入#2:
8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
样例输出#2:
8 265
2 264
6 264
1 258
5 258

#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct st{
    int c,m,e,n,s;
};
bool cmp(st x, st y){ //多个条件排序的时候要理清相互之间的关系,然后多设计几组数据来测试代码是否考虑全了
    if(x.s!=y.s) return x.s>y.s; //总分数不同的规则,总分数相同的时候跳过往下走
    if(x.c!=y.c) return x.c>y.c; //总分数相同而语文不同时的规则,语文相同往下走
    return x.n<y.n; //总分和语文相同时的规则
}
int main(){
    int i,n;
    st a[305];
    scanf("%d",&n);
    for(i=0;i<n;i++) {
        a[i].n=i+1;
        scanf("%d%d%d",&a[i].c,&a[i].m,&a[i].e);
        a[i].s=a[i].c+a[i].m+a[i].e;
    }
    sort(a,a+n,cmp);     
    for(i=0;i<5;i++) printf("%d %d\n",a[i].n,a[i].s);
    return 0;
}

1181:整数奇偶排序
【题目描述】
给定10个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后;
2.奇数按从大到小排序;
3.偶数按从小到大排序。
【输入】
输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于30000。
【输出】
按照要求排序后输出一行,包含排序后的10个整数,数与数之间以一个空格分开。
【输入样例】
4 7 3 13 11 12 0 47 34 98
【输出样例】
47 13 11 7 3 0 4 12 34 98

bool cmp(int x, int y){
    if(x%2==1 && y%2==0) return 1;
    if(x%2==0 && y%2==1) return 0;
    if(x%2==0&&y%2==0) return x<y;
    return x>y;
}
int main(){
    int i,n,a[15];
    for(i=0;i<10;i++)
        scanf("%d",a+i);
    sort(a,a+10,cmp);     
    for(i=0;i<10;i++) printf("%d ",a[i]);
    return 0;
}

1182:合影效果
【题目描述】
小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?
【输入】
第一行是人数n(2 ≤ n ≤ 40,且至少有1个男生和1个女生)。
后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。

【输出】
n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个数之间用单个空格隔开。
【输入样例】
6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56
【输出样例】
1.65 1.72 1.78 1.70 1.61 1.56

//字符串在需要比较的时候可以选择string,不需要比较可以用char[],主要是scanf读数要快一些

struct st{
    char s[10];
    double h;
};
bool cmp(st x, st y){
    if(x.s[0]=='m'&&y.s[0]=='f')return 1;
    if(x.s[0]=='f'&&y.s[0]=='m')return 0;
    if(x.s[0]=='m'&&y.s[0]=='m')return x.h<y.h;
    return x.h>y.h;
}
int main(){
    int i,n;
    st a[45];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%s%lf",&a[i].s,&a[i].h); 
    sort(a,a+n,cmp);     
    for(i=0;i<n;i++) printf("%.2lf ",a[i].h);
    return 0;
}

1183:病人排队
【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄 >= 60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
【输入】
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
【输出】
按排好的看病顺序输出病人的ID,每行一个。
【输入样例】
5
021075 40
004003 15
010158 67
021033 75
102012 30
【输出样例】
021033
010158
021075
004003
102012

struct ill{
    char id[20];
    int no,age;
};
bool cmp(ill x, ill y){
    if(x.age>=60&&y.age<60) return 1;
    if(x.age<60&&y.age>=60) return 0;
    if(x.age>=60&&y.age>=60){
        if(x.age!=y.age)return x.age>y.age;
        return x.no<y.no;
    }
    return x.no<y.no;
}
int main(){
    int i,n;
    ill a[105];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s%d",&a[i].id,&a[i].age);
        a[i].no=i;
    }    
    sort(a,a+n,cmp);     
    for(i=0;i<n;i++) printf("%s\n",a[i].id);
    return 0;
}