Sort排序
对于下部分代码
#include<bits/stdc++.h>
using namespace std;
{
int arr[]={1,5,6,2,4,3,10};
return 0;
}
sort(arr,arr+7);
可实现数组arr从小到大的排序
sort(arr+i,arr+j);
可实现数组从arr[i]到arr[j-1]的从小到大排序
sort(arr+i,arr+j,greater<int>);
可实现数组从arr[i]到arr[j-1]的从大到小排序
Bool cmp(TypeDate x,TypeDate y)
{
return x<y;
//可视为判断条件,当为true时x放在y前,当为false时y放在x前
}
sort(arr+i,arr+j,cmp);
可实现数组从arr[i]到arr[j-1]的按自己想要的方式排序
例题一:
找出班级的总分的第一名
输入样例:
3
Aaa 90 20 40
Bbb 60 60 60
Ccc 80 50 60
输出样例:
Ccc 190
参考代码:
#include<bits/stdc++.h>
using namespace std;
struct Student
{
string name;
int score[3];
Student(){}
Student(string n,int s1,int s2,int s3)
{
name=n;
score[0]=s1;
score[1]=s2;
score[2]=s3;
}
};
bool cmp(Student s1,Student s2)
{
int sum1,sum2;
sum1=s1.score[0]+s1.score[1]+s1.score[2];
sum2=s2.score[0]+s2.score[1]+s2.score[2];
return sum1>sum2;
}
int main()
{
Student stu[10];
int n,s1,s2,s3;
string name;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>name>>s1>>s2>>s3;
stu[i]=Student(name,s1,s2,s3);
}
sort(stu,stu+n,cmp);
cout<<stu[0].name
<<" "<<stu[0].score[0]+stu[0].score[1]+stu[0].score[2];
return 0;
}
例题二:
我们有N个正整数,均小于10000。现在需要将这些正整数按照除以3的余数从小到大排序,即除以3余O的数排在除以3余1的数前面,除以3余1的数排在除以3余2的数前面。如果余数相等,则按照正整数的值从小到大排序。
参考代码:
#include<bits/stdc++.h>
using namespace std;
bool cmp(int x,int y)
{
if(x%3!=y%3)
{
return x%3<y%3;
}
else
return x<y;
}
int main()
{
int arr[100],n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
sort(arr,arr+n,cmp);
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}
例题三:
比较浮点数中的小数点后的数,如果一样。比较整数部分大小。以从小到大的方式排序
参考代码:
#include<bits/stdc++.h>
#define EPS 1e-6
using namespace std;
bool cmp(double a,double b)
{
double da=fabs(a-round(a));
double db=fabs(b-round(b));
if(fabs(da-db)<EPS)
{
return a<b;
}
else
return da<db;
}
int main()
{
double arr[100];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
sort(arr,arr+n,cmp);
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}