C++實現——序列的下一個字典序
阿新 • • 發佈:2019-02-20
#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;
}