sort 排序(4)

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;
}
发布了41 篇原创文章 · 获赞 5 · 访问量 2285

猜你喜欢

转载自blog.csdn.net/mumuhaoshuai/article/details/100336135