允许重复:
//permutation 数组全排列:允许重复
void permutation(vector<int> v,int index) {
if (index == v.size()) {
for (int num : v) {
cout << num << " ";
}
cout << endl;
count1++;
return;
}
for (int i = index; i < v.size(); i++) {
if (v[i] != v[index])swap(v[i], v[index]);
permutation(v, index + 1);
if (v[i] != v[index])swap(v[i], v[index]);
}
}
例如 排列abc,上面的代码会递归调用15次
怎么计算调用次数呢?
f(n) = n+n*f(n-1)
f(1) = 1,f(0) = 0
不允许重复:
//permutation 数组全排列:不允许重复
void permutation(vector<int> v,int index) {
if (index == v.size()) {
for (int num : v) {
cout << num << " ";
}
cout << endl;
count1++;
return;
}
for (int i = index; i < v.size(); i++) {
//去重
auto it = find(v.begin() + i + 1, v.end(), v[i]);
if (it == v.end()) {
if (v[i] != v[index])swap(v[i], v[index]);
permutation(v, index + 1);
if (v[i] != v[index])swap(v[i], v[index]);
}
}
}
非递归:
//非递归全排序:
/*
1.先排序,
2.求得大于当前序列的最小序列:
首先:找到当前序列中最后面的v[k] < v[k+1]中的a[k]值,例如1,2,6,4,2;就是2<6;
如果没找到,表示当前序列已经按照降序排列,即已经是最大的了,over
然后: 从6开始查找大于2的最小值:4,交换2和4,得到1,4,6,2,2
最后:从6开始到最后的序列逆序:得到1,4,2,2,6,这就是1,2,6,4,2的下一个序列
3.重复 2
*/
void permutation(vector<int>&v) {
int len = v.size();
if (len == 0)return;
sort(v.begin(),v.end());
while (true) {
//输出
for_each(v.begin(), v.end(), [](int a) {cout << a << " "; });
cout << endl;
//2.求v[k]使得v[k]<v[k+1]
int i = 0;
for (i = len - 1; i > 0; i--) {
if (v[i] > v[i - 1]) {
break;
}
}
//如果没找到,那么表示已经排列完毕
if (i == 0) {
break;
}
//找到a[i]到a[len-1]大于a[i-1]的最小值:
int index = i,max = v[i];
for (int j = i; j < len; j++) {
if (v[j] > v[i - 1] && v[j] < max) {
max = v[j];
index = j;
}
}
//交换v[i-1]和v[index]
swap(v[i-1],v[index]);
//逆序v[i]到v[len-1]得到下一个序列
reverse(v.begin()+i,v.end());
}
}