1.字典序法

#include<iostream>
#include<algorithm>
using namespace std;
int cnt;
void println(int list[],int n){
for(int i = 0; i <= n; i++)
cout << list[i] << " ";
cout << endl;
}
//[l,r]
void fun(int list[],int l,int r){
int index_a;
int index_b;
int la,lb;
int i;
while(1){
//一定要交换并且排序后再打印
println(list,r-l);
//从右到左 找 第一个小于右边的数
for( i = r; i >= 0; i --)
if(i+1 <= r && list[i] < list[i+1]){
index_a = i;
la = list[i];
break;
}
//没有左边比右边小的数了 全排列完成 退出
if(i == -1)
break;
//从右到左 找 第一个大于la的数
for(i = r; ;i--)
if(list[i] > la){
index_b = i;
break;
}
//两个交换
swap(list[index_a],list[index_b]);
sort(list+index_a+1,list+r+1);
cnt ++;
}
}
int main()
{
int n = 4;
int list[12];
for(int i = 1; i <= n; i ++)
list[i-1] = i;
fun(list,0,n-1);
cout << "cnt = " << cnt+1 << endl;
return 0;
}
2.递归法
#include<iostream>
#include<algorithm>
using namespace std;
int cnt;
void println(int list[],int n){
for(int i = 1; i <= n; i++)
cout << list[i] << " ";
cout << endl;
}
//[k,r]左闭右闭区间 全排列
void fun(int list[],int k,int r){
if(k == r){
println(list,r);
cnt ++;
return;
}
for(int i = k; i <= r; i ++){
swap(list[i],list[k]);
fun(list,k+1,r);
swap(list[i],list[k]);
}
}
int main()
{
int n = 4;
int list[12] = {0};
for(int i = 1; i <= n; i ++)
list[i] = i;
fun(list,1,n);
cout << "cnt = " << cnt << endl;
return 0;
}
3.库函数
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n = 4;
int list[12];
for(int i = 1; i <= n; i ++)
list[i-1] = i;
do{
println(list,n);
cnt ++;
}while(next_permutation(list,list+n));
cout << "cnt = " << cnt << endl;
return 0;
}
本文深入探讨了全排列问题的三种解决方法:字典序法、递归法和使用库函数。通过具体的C++代码实现,详细解释了每种方法的工作原理,为读者提供了丰富的算法理解和实践案例。
692

被折叠的 条评论
为什么被折叠?



