STL标准库里有许多诸如排序、生成随机数的函数,使用前包含头文件
#include <algorithm>
排序:sort
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)
就行了,默认的排序方式是升序。
对vector对象排序:
sort(s.begin(),s.end());
- 排序的数据类型不局限于整数,只要是定义了
<
运算的类型都可以,比如字符串类string。 - 如果是没有定义
<
运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
bool cmp(int a,int b)
{
//升序排列,如果改为return a>b,则为降序
return a<b;
}
排序的时候就写sort(a,a+100,cmp);
- 标准库的sort算法实现,采用快排的思想,平均的时间复杂度是 N(logN);算法中还提供了其他的集中排序函数
sort_heap() stable_sort()
,时间复杂度都在 N(logN)。
生成随机数:rand、srand
rand函数的头文件在<stdlib.h>
中,如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX
间。RAND_MAX
定义在stdlib.h
, 其值为2147483647。
如果想要生成某个范围内的随机数,可以
int r=rand()%n;
但rand函数生成的只是伪随机数,要想生成真正的随机数,还需要用srand函数进行初始化。
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
使用当前时钟作为随机数种子
srand( (int)time(0) );
int r=rand()%n;
全排列函数 next_permutation
next_permutation()是按照字典序产生排列的,并且是从数组中当前的字典序开始依次增大直至到最大字典序。
基本的使用模板是:
int a[];
do{
}while(next_permutation(a,a+n));
下面的代码可产生1~n的全排列。
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)&&n){
int a[1000];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);//可以自行测试一下删除后的结果
do{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}while(next_permutation(a,a+n));
}
return 0;
}
例如输入
3
1 0 2
如果有sort()
输出为
0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0