全排列杂记-剑指offer面试45题
include
C++的<algorithm>头文件中实现了全排列,即next_permutation函数,它是基于字典序实现的,执行一次next_permutation函数就相当于进行了一次“变异”,变异之后字典序会比原来的字符串大,但其位次也仅仅排在变异之前的字符串之后。什么意思呢?比如"123"调用next_permutation函数经过一次变异之后会变成"132",而不是"213"、"321"等字典序更大的字符串。
next_permutation是有返回值的,返回值为true或false,意思是如果变异之后仍然产生了新的排列就会返回true,不能再产生新的排列了就会返回false。还是上面那个例子,如果当前字符串已经是"321"了,不存在字典序比"321"更大的排列了,此时就会返回false。因此,如果要进行全排列的字符串是"132",就应当先对其排序变成"123",否则在全排列时就会漏掉"123"。
二.sort函数
1.sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑!
2.sort函数的模板有三个参数:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
(1)第一个参数first:是要排序的数组的起始地址。
(2)第二个参数last:是结束的地址(最后一个数据的后一个数据的地址)
(3)第三个参数comp是排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排序方法是从小到大排序(升序)。第三个参数是排序函数,对于一些复杂的结构 比如pair 我们需要定义排序规则,例如:
bool myfunction (int i,int j) { return (i<j); } //升序排列
bool myfunction2 (int i,int j) { return (i>j); } //降序排列
bool myfunction3 (pair<int , int> i,pair<int , int> j) // 按照pair的第二个元素
{
return (i.second>j.second);
}
题外话(剑指offer第40题,倒数第k个数):用关联容器multiset,这里和set主要区别点就是其允许重复使用KEY,greater<int>,代表堆排序是顶是最大的,同理还有less<int>,例如multiset<int, greater<int>> min_k,表示mulset存储的是最大堆。</int></int></int></algorithm></algorithm>