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