C++:标准库函数(sort、rand等)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值