结构体用sort快排的方法

struct node{
    int k,s;
}p[5005];

bool cmp1(node x,node y){
    return x.s>y.s;   //定义降序排序(从大到小) 
}
bool cmp2(node x,node y){
    return x.k<y.k;   //定义升序排序(从小到大) 
}
sort(p+1,p+n+1,cmp2); //排序

看题目,洛谷p1068

题目描述

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,lua数组结构体_lua数组结构体

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入输出格式

输入格式:

 

第一行,两个整数 lua数组结构体_ci_02

第二行到第 lua数组结构体_lua数组结构体_03

 

输出格式:

 

第一行,有lua数组结构体_#include_04

从第二行开始,每行包含lua数组结构体_lua数组结构体_05

 

输入输出样例

输入样例#1: 

6 3 
1000 90 
3239 88 
2390 95 
7231 84 
1005 95 
1001 88

输出样例#1: 

88 5 
1005 95 
2390 95 
1000 90 
1001 88 
3239 88

说明

【样例说明】

lua数组结构体_lua数组结构体_06

NOIP 2009 普及组 第二题

 

 

这道题就是一个典型的结构体的排序

但是首先需要面试成绩的从大到小的排序,然后才是相同的成绩再去从小到大对编号去排序。

而sort是一个不稳定的排序,因为当数据量稍大时,sort()就会使用快速排序,而快速排序是不稳定排序,即不能保证原序列中相等的元素在排序后保持相对位置不变。

即如果排序之后的两者成绩相同,但是由于快排是不停的交换位置的排序,所以相同成绩的两者的相对位置会变换,所以造成的不稳定排序。

稳定排序的概念:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r [ i ]=r [ j ],且r [ i ]在r [ j ]之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

所以这题应该用的是STL里面的稳定排序stable_sort。

AC代码:

#include<iostream>
#include<algorithm>
using namespace std;

struct node{
    int k,s;
}p[5005];

bool cmp1(node x,node y){
    return x.s>y.s;   //定义降序排序(从大到小) 
}
bool cmp2(node x,node y){
    return x.k<y.k;   //定义升序排序(从小到大) 
}

int main(){
    int n,m;
    cin>>n>>m;
    m=m*15/10;
    for(int i=1;i<=n;i++){
        cin>>p[i].k>>p[i].s;
    }
    sort(p+1,p+n+1,cmp2); //快排排序 
    stable_sort(p+1,p+n+1,cmp1); //稳定排序
    cout<<p[m].s<<" ";
    for(int i=m+1;i<=n;i++){
        if(p[i].s==p[m].s){
            m++;
        }
        else break;
    }
    cout<<m<<endl;
    for(int i=1;i<=m;i++){
        cout<<p[i].k<<" "<<p[i].s<<endl;
    }
    return 0;
}

 

还有一种是对字符串的结构体sort排序。

 

题目背景

宇宙总统竞选

题目描述

地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

输入输出格式

输入格式:

 

president.in

第一行为一个整数n,代表竞选总统的人数。

接下来有n行,分别为第一个候选人到第n个候选人的票数。

 

输出格式:

 

president.out

共两行,第一行是一个整数m,为当上总统的人的号数。

第二行是当上总统的人的选票。

 

输入输出样例

输入样例#1: 复制

5
98765
12365
87954
1022356
985678

输出样例#1: 复制

4
1022356

说明

票数可能会很大,可能会到100位数字。

n<=20

 

AC代码:

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct{
    string str;
    int p;
}aaa;

bool cmp(aaa a,aaa b){
    if(a.str.size()==b.str.size()){
        return a.str<b.str; 
    }
    return a.str.size()<b.str.size();
}
int main(){
    aaa m[22];
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>m[i].str;
        m[i].p=i;
    }
    sort(m+1,m+n+1,cmp);
    cout<<m[n].p<<endl<<m[n].str;
    return 0;
}