核心
我们先从最小的排序开始,依次寻找比当前排序大的最小排序,实现该方法的关键就在于寻找交换点和交换数。
//Author by [Rainboy](https://github.com/rainboylvx)
//date: 2024-06-28 19:41:41
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n,m;
int a[maxn];
void print_a() {
for(int i = 1;i <= n ;++i ) // i: 1->n
{
cout << a[i] << " ";
}
std::cout << "\n";
}
void next_permutation() {
while (1) {
print_a();
// 从右向左找到第一个非递增的数
int idx = 0;
for(int i = n-1 ;i >= 1; --i) {
if( a[i] < a[i+1]) {
idx = i;
break;
}
}
//没有找到,说明达到最后一种终止状态
if( idx == 0) return ;
// 从右向左找到第一个比交换点大的数
int j ;
for(int i = n ;i >=1 ; --i) {
if( a[i] > a[idx])
{
j = i;
break;
}
}
//交换
std::swap(a[idx],a[j]);
//排序
if( idx+1 < j )
std::sort(a+idx+1,a+j);
}
}
int main (int argc, char *argv[]) {
std::cin >> n;
for(int i = 1;i <= n ;++i ) // i: 1->n
{
a[i] = i;
}
next_permutation();
return 0;
}