本文章基于《计蒜客2019年蓝桥杯算法训练营》整理记录,并由本人对部分内容进行补充,仅用于个人学习交流使用。
2.Sort排序
1.sort排序基础
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y) {
return x>y;//降序
}
bool cmp2(int x,int y) {
int a1=x%2;
int a2=y%2;
return a1>a2;//对2求余后的降序
}
int main() {
int a[10];
for(int i=0; i<10; i++) {
cin>>a[i];
}
sort(a,a+10);//默认升序
for(int i=0; i<10; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
sort(a,a+10,greater<int>());//降序greater<int>()
for(int i=0; i<10; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
sort(a,a+10,cmp);//自定义函数-降序
for(int i=0; i<10; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
sort(a,a+10,cmp2);//自定义函数-除余降序
for(int i=0; i<10; i++) {
cout<<a[i]<<" ";
}
return 0;
}
2.结构体排序
//结构体基础
struct Student {
int score;
string name;
//结构体构造函数
/*性质/特点
1.函数名与结构体名相同
2.没有返回值类型,没有return
3.形参可有可无,可以有默认参数
4.可以重载
*/
//默认构造函数 Student(){}
Student(string name,int s) {
name=n;
score=s;
}
}
#include<iostream>
#include<cstring>
using namespace std;
//结构体的构造函数--可以实现直接给构造体成员赋值
struct Student{
int score;
string name;
//结构体初始化列表
Student() {} //不可以省
Student(string n,int s):name(n),score(s){}
};
int main() {
//结构体的初始化
Student stu[3];
//结构体赋值
for(int i=0;i<3;i++){
string n;
int s;
cin>>n>>s;
stu[i]=Student(n,s);
}
//结构体遍历
for(int i=0;i<3;i++){
cout<<stu[i].name<<" "<<stu[i].score<<endl;
}
return 0;
}
//案例:结构体按名字排序
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Student{
string name;
int score[4];
};
//排序规则
bool cmp(Student x,Student y){
return x.name < y.name;
}
int main(){
Student stu[3];
for(int i=0;i<3;i++){
cin>>stu[i].name;
for(int j=0;j<4;j++){
cin>>stu[i].score[j];
}
}
sort(stu,stu+3,cmp);
for(int i=0;i<3;i++){
cout<<stu[i].name<<":";
for(int j=0;j<4;j++){
cout<<stu[i].score[j]<<" ";
}
cout<<endl;
}
return 0;
}
/*案例:按成绩排序
输入:学生姓名 第1-4科成绩
输出:按成绩高低输出,如果第一门相同,则比较第二门成绩
案例:
输入:
aaa 100 65 85 99
bbb 100 65 89 52
ccc 100 88 20 59
输出:
ccc:100 88 20 59
bbb:100 65 89 52
aaa:100 65 85 99
*/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student {
string name;
int score[4];
};
//排序规则
bool cmp(Student x,Student y) {
if(x.score[0]!=y.score[0])
return x.score[0]>y.score[0];
if(x.score[1]!=y.score[1])
return x.score[1]>y.score[1];
if(x.score[2]!=y.score[2])
return x.score[2]>y.score[2];
return x.score[3]>y.score[3];
}
int main() {
Student stu[3];
for(int i=0; i<3; i++) {
cin>>stu[i].name;
for(int j=0; j<4; j++)
cin>>stu[i].score[j];
}
sort(stu,stu+3,cmp);
for(int i=0; i<3; i++) {
cout<<stu[i].name<<":";
for(int j=0; j<4; j++) {
cout<<stu[i].score[j]<<" ";
}
cout<<endl;
}
return 0;
}
3.Sort排序练习
/*浮点数排序:
现在有N个正浮点数,现在需要将这些浮点数按照离他最近
的整数的差从小到大排序,浮点数与距离最近的整数的差
越小,这个浮点数的排位越靠前;如果差相等,按照浮点
数的值从小到大排序。
*/
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double ERSILON =1e-6;
//ERSILON用于修正浮点数误差,
//当两个浮点数相差1e-6时,我们认为他们相等
double num[105];
//浮点数按照离他最近的整数的差从小到大排序
bool cmp(double a,double b) {
//round()四舍五入函数
double da=fabs(a-round(a));
double db=fabs(b-round(b));
if(fabs(da-db)<ERSILON) {
return a<b;
}
return da<db;
}
int main() {
int N;
cin>>N;
for(int i=0; i<N; i++) {
cin>>num[i];
}
sort(num,num+N,cmp);
for(int i=0;i<N;i++){
printf("%lf ",num[i]);
}
return 0;
}
//练习:交叉排序
//N个数中,第l1到r1升序,第l2到r2降序
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int N,l1,r1,l2,r2;
cin>>N>>l1>>r1>>l2>>r2;
int num[10005];
for(int i=0;i<N;i++){
cin>>num[i];
}
sort(num+l1-1,num+r2);
sort(num+l2-1,num+r2,greater<int>());
for(int i=0;i<N;i++){
cout<<num[i]<<" ";
}
return 0;
}
/*样例输入:
6 1 3 2 4
8 3 1 6 9 2
样例输出:
1 8 6 3 9 2
*/
4.Vector()中的Sort()排序
重点: sort(ve.begin(),ve.end());
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> ve;
for(int i=10; i>0; i--) {
ve.push_back(i);
}
cout<<"排序前-----"<<endl;
for(int i=0; i<10; i++) {
cout<<ve[i]<<" ";
}
cout<<endl;
sort(ve.begin(),ve.end());// 用 (ve,ve+10) 是错的
//实际上end的前一个指针指向的元素才是插入时的最后一个值
cout<<"排序后-----"<<endl;
for(int i=0; i<10; i++) {
cout<<ve[i]<<" ";
}
cout<<endl;
//Vector()数组的另一种遍历
for(vector<int>::iterator it=ve.begin();it!=ve.end();it++){
cout<<*it<<" ";
}
return 0;
}
/*
排序前-----
10 9 8 7 6 5 4 3 2 1
排序后-----
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
*/