(1) 对于输入的字典序排列<a1,a2,…,an>,反向查找第一对满足a[j]<a[j+1],得到下标j
(2) 仍旧反向查找第一个下标k,使得 a[j]<a[k]
(3) 交换a[j]和a[k]
(4) 翻转a[j+1]~a[end]
此法能适应有重复元素的系列
代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
int cmp(const void* a, const void* b){
return *(int*)a - *(int*)b;
}
inline void println(int arr[], int len){
for(int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl;
}
inline void reverse(int arr[], int left, int right){
while(right >= left){
swap(arr[left++], arr[right--]);
}
}
void full_permutation(int arr[], int len){
qsort(arr, len, sizeof(int), cmp);
println(arr, len);
while(true){
int j = len-1;
int t = len;
while(j >= 0 && arr[--j] >= arr[j+1]) ;
if(j >= 0){
while(arr[--t] <= arr[j]) ;
swap(arr[t], arr[j]);
reverse(arr, j+1, len-1);
println(arr, len);
}
else{
break;
}
}
}
int main(int argc, char* argv)
{
int testArr[] = {23, 43, 8, 8};
int len = sizeof(testArr)/sizeof(int);
full_permutation(testArr, len);
return 0;
}