| 类别:算法 | 组件类型:函数 |
template <class BidirectionalIterator>
bool next_permutation(BidirectionalIterator first,
BidirectionalIterator last);
template <class BidirectionalIterator, class StrictWeakOrdering>
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last,
StrictWeakOrdering comp);
后置条件是元素的新排列按字典序比旧排列大(由lexicographical_compare确定),当且仅当返回值为true.
的两个版本next_permutation在如何定义一个元素是否小于另一个元素时存在差异。第一个版本使用operator<来比较对象,而第二个版本使用 函数对象comp.
template <class BidirectionalIterator>
void snail_sort(BidirectionalIterator first, BidirectionalIterator last)
{
while (next_permutation(first, last)) {}
}
int main()
{
int A[] = {8, 3, 6, 1, 2, 5, 7, 4};
const int N = sizeof(A) / sizeof(int);
snail_sort(A, A+N);
copy(A, A+N, ostream_iterator<int>(cout, "\n"));
}
[1]如果[first,last)中的所有元素彼此不同,那么完全有N!排列。但是,如果某些元素与彼此相同,排列的数量会减少。例如,只有三种(3!/2!)排列元素1 1 2.
[2] 请注意按词典顺序最小的排列定义上按非递减排列。