递归:
#include <bits/stdc++.h>
using namespace std;
void swap(int a[],int n,int m){
int temp = a[n];
a[n] = a[m];
a[m] = temp;
}
bool panduan(int a[],int n,int m){
for(int i = n;i<m;i++){
if(a[i]==a[m]) return false;
}
return true;
}
void fullarray(int a[],int p,int q){
if(p==q){
for(int i = 0;i<p;i++){
cout<<a[i];
if(i!=p) cout<<" ";
}
cout<<endl;
}
else{
for(int i = p;i<q;i++){
if(panduan(a,p,i)){ //在此判断是否有重复元素
swap(a,p,i);
fullarray(a,p+1,q);
swap(a,p,i);
}
}
}
}
int main(){
int a[3] = {1,2,2};
fullarray(a,0,3);
return 0;
}
非递归:
#include<bits/stdc++.h>
using namespace std;
//交换函数
void Swap(int a[],int c,int b){
int temp = a[c];
a[c] = a[b];
a[b] = temp;
}
//置换顺序函数
void Reverse_order(int a[],int m,int n){
int s = m;
int b = n;
for(;b>s;s++,b--){
Swap(a,s,b);
}
}
//输出函数
void Print(int a[],int len){
for(int i = 0;i<len;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
//全排列函数
void Array(int a[],int len){
int i,j;
while(1){
Print(a,len);
for(i = len-2;i>=0;i--){ //顺便判断退出条件
if(a[i]<a[i+1]) break;
else if(i==0) return;
}
for(j = len-1;j>i;j--){
if(a[j]>a[i]) break;
}
Swap(a,i,j);
Reverse_order(a,i+1,len-1);
}
}
int main(){
int a[4] = {1,2,3,4};
Array(a,4);
return 0;
}