蓝桥杯 第三天 sort排序

目录

1.1sort的简介

1.2sort的用法

1.2.1默认用法:

1.2.2方法2

1.3自定义比较函数

1.3.1 函数

1.3.2 lambda表达式

1.3.3 结构体 重载小于号

1.4例题


1.1sort的简介

sort函数包含在头文件<algorithm>中

在使用前需要#include<algorithm>或者使用万能文件(#include <bits/stdc++.h>).

sort是c++标准库中的一个函数模板,用于对指定范围内的元素进行排序.

sort算法使用的是快速排序或者类似快速排序的改进算法,具有较好的平均时间复杂度,一般O(n).

1.2sort的用法

1.2.1默认用法:

sort(起始地址,结束地址的下一位,*比较函数);//默认不写且默认用小于号 升序

int a[1000];
int n;
cin>>n; //读取数组大小
for(int i=1;i<=n;++i) cin >> a[i];
sort(a+1,a+n+1);    //[1,n+1)左闭右开
//   a[1] a[n+1]
for(int i=1;i<=n;++i) cout<<a[i]<<' ';

1.2.2方法2

sort(起始地址,结束地址的下一位,结束地址的下一位,*比较函数);

vector<int> v = {5,1,3,9,11};
sort(v.begin(),v.end());
//2个输出都可以
for(int i=0;i<v.size();++i) cout<<v[i]<<' ';
for(auto i:v) cout<<i<<' ';

1.3自定义比较函数

1.3.1 函数

sort默认使用小于号进行排序,如果需要自定义规则,可以使用函数

bool cmp(const int &u,const int &v)
{
    return u>v;
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    vertor<int> v= {5,1,3,9,11};
    sort(v.begin(),v.end(),cmp);
    for(int i=0;i<v.size();++i) cout<<v[i] <<' '; //输出11 9 5 3 1
}

1.3.2 lambda表达式

vector<int> v = {5,1,3,9,11};
sort(v.beging(),v.end(),[](const int &u,const int &v)
{
    return u>v;
});
//输出
for(int i=0;i<v.size();++i) cout<<v[i]<<' ';

1.3.3 结构体 重载小于号

struct Node
{
    int u,v;
    bool operator < (const Node &m) const
    {
        return u==m.u ? v<m.v:u<m.u;
    }
};

1.4例题

蓝桥杯 1265

//这样是不会通过的因为效率太低了
#include <bits/stdc++.h>
using namespace std;
int main() 
{
  int a,b[100];
  cin>>a;
  for(int i=1;i<=a;i++) cin>>b[i];
  sort(b+1,b+a+1);
  for(int i=1;i<=a;i++) cout<<b[i]<<' ';
  return 0;

}

正确答案

#include <bits/stdc++.h>
using namespace std;

const int N=5e5+3;
int b[N];

int main()
{
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  int a;cin>>a;
  for(int i=1;i<=a;i++) cin>>b[i];

  sort(b+1,b+a+1);

  for(int i=1;i<=a;i++) cout<<b[i]<<" \n"[i == a];  //[i==a]其实这里就是判断是否结束
  for(int i=a;i>=1;i--) cout<<b[i]<<" \n"[i == 1];
  return 0;
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值