#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//全排列函数 next_permutation
//给定一个数组 要求下一个比它大的序列
//处理函数
/**
* a 待排列数组的引用
* return 若有下一序列返回true 若无返回false
*/
bool my_nextPermutation(vector<int>& a){
//如果不存在下一个则返回false
int i, j;
for (i = a.size() - 1; i > 0; i--){
if (a[i] > a[i - 1]){
break;
}
}
//如果已经完全是将序排列的,就不再有下一个序列了
if (i == 0)return false;
//从右侧找到第一个比a[i-1]大的数,进行置换
for (j = a.size() - 1; j > i - 1; j--){
if (a[j] > a[i - 1]){
break;
}
}
swap(a[j], a[i - 1]);
//将a[i-1]后面的数进行升序排列
//此处也可以用reverse(a.begin()+i,a.end()),因为原先是将序排列的
sort(a.begin() + i, a.end());
return true;
}
//测试函数
int main(){
vector<int> v{1,2,3,4};
do{
for (auto a : v){
cout << a << " ";
}
cout << endl;
} while (my_nextPermutation(v));
return 0;
}
C++实现——序列的下一个字典序
最新推荐文章于 2024-04-27 15:33:47 发布