sort 在 STL 库中是排序函数,有时冒泡、选择等 $\mathcal O(n^2)$ 算法会超时时,我们可以使用 STL 中的快速排序函数 $\mathcal O(n \ log \ n)$ 完成排序

sort 在 algorithm 库里面,原型如下:

template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

我们会发现 sort 有两种形式一个有三个参数,一个有两个参数,我们先讲讲两个参数的吧!

sort 的前两个参数是起始地址和中止地址

如:sort(a,a+n) 表示对 a[0] ... a[n-1] 排序

代码如下:

#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
int n,a[1001];
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1); //对a[1] ... a[n] 排序
for (int i = 1;i <= n;i++) printf("%d",a[i]);
return 0'
}

这样是默认升序的,那如果是降序呢?

这样,我们就要用到第三个参数,第三个参数是一个比较函数

bool cmp(int a,int b) { return a > b; }

这个就是降序排序的比较函数,意思是:

是 a > b 时为true,就不交换,a < b 时为 false,交换

然后我们调用 sort(a+1,a+n+1,cmp) 就可以对 a 数组进行排序了

还可以调用 greater 和 less 进行升/降序排序,其实就是一个帮你写好的函数

int a[11],n;
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1,greater<int>()); //升序
sort(a+1,a+n+1,less<int>()); //降序,注意尖括号内写的是排序的数组类型

sort 也能对结构体排序,如:

#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
int x,y;
} p[1001];
int n;
bool cmp(Node a,Node b) {
if (a.x != b.x) return a.x < b.x;
return a.y < b.y;
}
int main() {
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+n+1,cmp);
for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);
return 0;
}

以上代码的意思是,对 p 数组按 x 升序排序,若两个数的 x 相等则按 y 升序排序

结构体还可以重载运算符(greater 和 less 都是重载运算符的),使 sort 只用两个参数就可以按自己的规则排序,如:

#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
int x,y;
bool operator < (Node cmp) const {
if (a.x != cmp.x) return a.x < cmp.x;
return a.y < cmp.y;
}
}p[1001];
int n;
/*bool cmp(Node a,Node b) {
* if (a.x != b.x) return a.x < b.x;
* return a.y < b.y;
*}
*/
int main() {
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+n+1);
for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);
return 0;
}

最新文章

  1. 安卓开发之ListAdapter(一)
  2. numpy常用用法总结
  3. Django Web补充
  4. 理解Android虚拟机体系结构
  5. C#之显示效果
  6. ZOJ 1110 Dick and Jane
  7. sublime3安装python插件 -- SublimeCodeIntel
  8. 统计学习方法——P1
  9. position: absolute 的元素自动对齐父元素 border 外边缘
  10. LayoutInflater和inflate()方法的使用方法
  11. [Swust OJ 179]--火柴棍(找规律)
  12. SpringMVC源码情操陶冶-DispatcherServlet
  13. 【Python游戏编程01--初步认识pygame】
  14. 比较List和ArrayList的性能及ArrayList和LinkedList优缺点
  15. JavaScript – Convert Image to Base64 String
  16. 使用google guava做内存缓存
  17. HDU 4825 Xor Sum(01字典树入门题)
  18. Magento2 php商城在windows10上安装
  19. pandas 实现通达信里的MFI
  20. java中int和Integer比较

热门文章

  1. .net core https 双向验证
  2. HTTP request smuggling CL.TE
  3. Mysql的复制原理以及流程
  4. springboot(三)SpringDataJPA完成CRUD
  5. 【CVPR2020】Wavelet Integrated CNNs for Noise-Robust Image Classification
  6. python socket函数详解
  7. 第四章 常用API(上)
  8. Day02_IP地址详解&amp;进制转换&amp;DOS基本命令与批处理
  9. Day04_企业权限管理(SSM整合)
  10. Django学习路19_is_delete属性,重写类方法,显性隐性属性