sort 函数小结

sort 函数小结
头文件:#include
形式:sort(参数一(排序首端地址),参数二(排序末端地址),参数三);
//其中第三个参数可不填。其排序区间为[i,j);
一般有四种写法
写法一:
int a[6]={1,6,2,4,8,2};
sort(a,a+6);//此形式默认为升序
输出1,2,2,4,6,8
写法二:

#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
	int a[5]={2 ,1 ,3 ,4 ,5};
	sort(a,a+5,less <int >());
	for(int i=0;i<5;i++)
	cout<<a[i]<<" ";
	return 0;
}

//输出 1 2 3 4 5
注:⑴greater()为升序,less()为降序
⑵如果使用此形式需要加头文件:#include
具体参详下题:
题目:
给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列。
输入:
输入可能包含多组数据,其中每组数据包括两行:
第一行两个数N和M,
第二行N个数,表示该序列。
输出:
对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
Sample Input:
4 4
1 2 3 4
4 5
5 3 6 4
Sample Output:
7 6 5 5
11 10 9 9 8
代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<functional>
using namespace std;
int a[3010], b[9000010];
int main()
{
	int n,m,*p;
	while(cin>>n>>m)
	{
		for(int i=0;i<n;i++)
			cin>>a[i];
		int static d=0;
		for(int i=0;i<n;i++)
		{
			for(p=&a[i+1];p<a+n; p++,d++)
				b[d]=a[i]+(*p);//定义一个静态变量d,以便间接统计数组b[]的元素个数 
		}
		sort(b,b+d,greater<int >());//升序排列,less<int>()为降序 
		for(int i=0;i<m;i++)//greater<int>()和less<int>()需要加头文件 #include<functional>
		{
			if(i == m-1) cout<<b[i]<<endl;//注意空格和换行的输出 
			else cout<<b[i]<<" ";
		}
	}
	return 0;
}

写法三:(重载方式,自定义排序)
bool cmp(int a,int b)
{
return a<b;// 从小到大排序
return a>b;// 从大到小排序
}
sort(a,a+n,cmp);
把上一题改一下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<functional>
using namespace std;
int a[3010], b[9000010];
bool cmp(int a,int b)
{
	return a>b;//按从大到小降序排列 
}
int main()
{
	int n,m,*p;
	while(cin>>n>>m)
	{
		for(int i=0;i<n;i++)
			cin>>a[i];
		int static d=0;
		for(int i=0;i<n;i++)
		{
			for(p=&a[i+1];p<a+n; p++,d++)
				b[d]=a[i]+(*p);
		}
		sort(b,b+d,cmp);
		for(int i=0;i<m;i++)
		{
			if(i == m-1) cout<<b[i]<<endl;
			else cout<<b[i]<<" ";
		}
	}
	return 0;
}

写法四:(sort+结构体)
bool cmp(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,cmp);
比如以下程序:

#include<algorithm>
#include<iostream>
#include<string.h>
struct node`
{
	int score;
	string name;
}sum[1000];
bool cmp1(node a,node b)
{
	return a.score<b.score;//按score升序 
}
bool cmp2(node a,node b)
{
	
	return a.name<b.name; //按name升序
}
bool cmp3(node a,node b)
{
	if(a.score==b.score) return a.name<b.name;//如果score一样则按score升序 
	else return a.score<b.score;//按score升序 
}
int main()
{
	int n,m;
	while(scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
	cin >> sum[i].score >> sum[i].name;
	sort(sum,sum+n,cmp1);
	cout <<sum[0].score<<endl;//输出最低的score 
	sort(sum,sum+n,cmp2);
	cout <<sum[0].name<<endl;//输出按name排序的第一个name
	sort(sum,sum+n,cmp3); 
	cout<<sum[1].score<<" "<<sum[1].name<<endl;//输出排序后的第二个 
	
	}
}

输入:
5
1 f
1 a
4 d
3 c
2 b
排序过后:1 a->1 f->2 b->3 c->4 d
输出:
1
a
1 f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值