还在用 STL 排序?
使用 C 库函数
很多人都不知道的是,其实 C 语言也是自带排序函数的,就是位于 <stdlib.h>
库中的 qsort
函数声明:
1 | void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) |
其中
- base - 指向要排序的数组的第一个元素的指针
- nitems - base 指向的数组中元素的个数
- size - 数组中每个元素的大小(以字节为单位)
- compar - 用来比较两个元素的函数
与 <algorithm>
中的 std::sort
略有差异,尤其是在 compar
函数的定义上。
其形参必须是 const void*
型(可以理解为,在 compar
函数内部会将 const void*
型转换成实际类型)。
- 如果返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
- 如果返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
- 如果返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。
在 C11
标准中,新增了另一个排序函数 qsort_s
,但在无编译开关的情况下无法使用。
另外,虽然它的名字叫 qsort
,但目前还没有任何一个 C 标准规定其必须通过快排实现()
实测在整数排序下,效率与 STL
相差无几,都在 140ms/1.20MB
左右。
Code © :
1 |
|
使用 PB_DS
PB_DS
,又称平板电视,是一个冷门但功能极为强大的 GNU-cpp
扩展库,但在 OI
中(尤其是省选以下)极少用到。
该库中提供了大量数据结构(虽然不开O2的话几乎都会T掉),以树形结构为主,拿出来基本个个都可以排序
堆:
(未开 O2,248ms/5.23MB
)
1 |
|
由于 pb_ds
中的 tree
相当于 set
而不是 multiset
,因此比手写快排还长,不再展示。
还在用 STL 排序?