next_permutation()
作用:
按照字典序返回组合所有字符的排列组合。
函数原型:
(1) bool next_permutation(BidirectionalIterator first,BidirectionalIterator last);
(2) bool next_permutation(BidirectionalIterator first,BidirectionalIterator last,Compare comp);
返回值:
如果没有下一个排列组合,返回false,否则返回true。每执行next_permutation()一次,就会把新的排列放到原来的空间里。
复杂度:
O(n)
排列范围:
[first,last),左开右闭。
求全排序:
以vector< int > a 为例:
vector<int> a;
sort(a.begin(),a.end());
do
}
for(int i = 0;i<a.size();i++)
cout<<a[i];
}while(next_permutation(a.begin(),a.end()));
//注意,跳出循环时的最后一次排列仍然会做,即最后数组中的元素顺序同 sort(a.begin(),a.end())
//要判断是否全排列已完成,需要用:
//prev_permutation(a.begin(),a.end()) ==false;
附:字典序排序与自然数大小排序转换
1,2,10,按字典序会排序成1,10,2。
解决方法:就是在比较字典序排序大小时,先按照长度判定大小,如果A长度>B长度,判定A>B。
对于同样长度的数字数组,他们的字典序排序就是自然数排序。