您的位置:首页 > 其它

sort 排序(4)

2020-02-02 19:46 155 查看

sort 排序

sort 排序函数是在 C++ 中的一个库函数,它所在的头文件
为 algrithm.h,它其实就是对快速排序算法的封装。它的时间复杂度为 O(n ∗ log(n))**
使用范围: 数组结构体 sting 队列 vector……

形式:sort(参数一, 参数二,参数三)
形式:sort(首地址, 尾地址,cmp)(cmp就是自定义的一个函数,意思是按照什么样的规则排序)

sort默认从小到大排序。

eg:
int a[5]={2,1,3,4,5};
sort(a,a+5);//0-4 排序 , 区 间 前 开 后 闭

自定义排序:

bool cmp(int a,int b)
{
return a<b;// 从 小 到 大 排 序
return a>b;// 从 大 到 小 排 序
}
sort(a,a+n,cmp);

sort+ 结构体排序:

bool cmp1(node a,node b)// 自 定 义 排 序 函 数
{
if(a.grade!=b.grade)
return a.grade >b,grade;
return a.id<b.id;// 按照 id 排序 ,a<b 表示升序 ,a>b 降序
}
sort(a,a+n,cmp1);

板子基本就是上面那样,还是直接来几个板子题吧!为了更好的理解,这几个板子稍微复杂点。
HDU - 1280 前m大的数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int m,n,i,j,k;
int a[10000];
int b[10000*10000/2];
int cmp(const int a,const int b)   //定义sort的第三个参数,表示从小到大排列
{
return a>b;
}

int main()
{
while(scanf("%d %d",&n,&m)!=-1)
{
for(i=0;i<n;i++)       //先读入
scanf("%d",&a[i]);
k=0;
for(i=0;i<n-1;i++)   //求出俩俩数的和,存入一个数组中。
for(j=i+1;j<n;j++)
b[k++]=a[j]+a[i];

sort(b,b+(n*(n-1))/2,cmp);  //sort排序
for(i=0;i<m;i++)
{
if(!i)
printf("%d",b[i]);
else
printf(" %d",b[i]);
}
printf("\n");
}
return 0;
}

再来一个结构体的板子题:
HDU - 1872 稳定排序

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
string name;
int score;
int id;
}stu[500],stu1[500];
bool cmp(node a,node b)  //其实这个cmp就是定义一个结构体,再让这个结构体按照某种自己想要的顺序排序
{
if(a.score!=b.score)
return a.score>b.score;
else
return a.id<b.id;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>stu[i].name>>stu[i].score,stu[i].id=i;
sort(stu,stu+n,cmp);

int flag=0;
for(int i=0;i<n;i++)
{
cin>>stu1[i].name>>stu1[i].score;
if(stu1[i].score!=stu[i].score)
flag=1;     //  Error;
else if(stu1[i].name!=stu[i].name)
flag=2;     //  Not Stable;
}

if(!flag)
cout<<"Right"<<endl;
else if(flag==1)
{
cout<<"Error"<<endl;
for(int i=0;i<n;i++)
cout<<stu[i].name<<' '<<stu[i].score<<endl;
}
else if(flag==2)
{
cout<<"Not Stable"<<endl;
for(int i=0;i<n;i++)
cout<<stu[i].name<<' '<<stu[i].score<<endl;
}
}
return 0;
}

相关题目:
A and B and Compilation Errors CodeForces - 519B(贼简单但是坑死宝宝)
Magical Bamboos -Gym - 101350D
Bear and Three Balls- CodeForces - 653A
今年暑假不AC HDU - 2037
The sum problem HDU - 2058
开门人和关门人 HDU - 1234
EXCEL排序 HDU - 1862 (有点难)
统计同成绩学生人数 HDU - 1235
What Is Your Grade? HDU - 1084 (难)

这里给出 What Is Your Grade? HDU - 1084的AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
struct node
{
int num;
int time;
int id;//用来记录初始每个数的位置
int r;//用来记录每个数出现的次数
int sorce;
}stu[1000];
int cmp(node a,node b)
{
if(a.num!=b.num)
return a.num>b.num;
if(a.num==b.num)
return a.time<b.time;
}
int cmp1(node a,node b)
{
return a.id<b.id;
}
int main()
{
int n;
int num,h,m,sec;
int aa[6];//用来记录做出每个题的人数
while(cin>>n)
{
if(n==-1)
break;
for(int i=0;i<n;i++)
{
scanf("%d %d:%d:%d",&num,&h,&m,&sec);
stu[i].num=num;
stu[i].time=h*3600+m*60+sec;
stu[i].id=i;
}
sort(stu,stu+n,cmp);

int s=1;
num=stu[0].num;
stu[0].r=1;
for(int i=1;i<n;i++)//统计做出n个题的这个人在所有做出这个题的人数的排名
{
if(num==stu[i].num)
{
s++;
stu[i].r=s;
if(i==n-1)
{
aa[num]=s;
break;
}
}
else
{
aa[num]=s;
num=stu[i].num;
s=1;
stu[i].r=s;
if(i==n-1)
aa[num]=s;
}
}

for(int i=0;i<n;i++)
{
if(stu[i].num==5)
stu[i].sorce=100;
else if(stu[i].num==4)
{
if(stu[i].r<=aa[4]/2||aa[4]==1)
stu[i].sorce=95;
else
stu[i].sorce=90;
}

else if(stu[i].num==3)
{
if(stu[i].r<=aa[3]/2||aa[3]==1)
stu[i].sorce=85;
else
stu[i].sorce=80;
}

else if(stu[i].num==2)
{
if(stu[i].r<=aa[2]/2||aa[2]==1)
stu[i].sorce=75;
else
stu[i].sorce=70;
}

else if(stu[i].num==1)
{
if(stu[i].r<=aa[1]/2||aa[1]==1)
stu[i].sorce=65;
else
stu[i].sorce=60;
}
else
stu[i].sorce =50;
}
sort(stu,stu+n,cmp1);
for(int i=0;i<n;i++)
printf("%d\n",stu[i].sorce);
printf("\n");
}
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
〆℡小短腿走快点ゝ 发布了30 篇原创文章 · 获赞 1 · 访问量 1424 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐