生成上/下一个排列
生成下一个排列
我们从排列的后面找到第一个递减的位置 e e e,说明 e e e之前的排列均已经排列完了,我们把 e e e位置上的元素与 e e e之后第一个大于它的元素交换位置,最后将 e e e之后的元素按照升序排列即可。
生成上一个排列
我们从排列的后面找到第一个递增的位置 e e e,说明 e e e之前的排列是第一个排列,我们把 e e e位置上的元素与 e e e之后第一个小于它的元素交换位置,最后将 e e e之后的元素按照降序排列即可。
代码
生成上一个排列。
#include <bits/stdc++.h>
using namespace std;
#define FR freopen("in.txt","r",stdin)
typedef long long ll;
int arr[25];
int n;
bool solve()
{
int e = n-1;
for(; e>=0; e--)
{
if(arr[e] > arr[e + 1])
{
break;
}
}
if(e == 0)
{
return false;
}
int i = n;
for(;i>e;i--)
{
if(arr[i] < arr[e])
{
break;
}
}
swap(arr[e],arr[i]);
sort(arr+e+1,arr+1+n,greater<int>());
return true;
}
int main()
{
arr[0] = INT_MAX;
cin >> n;
for(int i = 1; i<=n; i++)
cin >> arr[i];
if(solve())
copy(arr+1,arr+n+1,ostream_iterator<int>(cout," "));
else cout << "ERROR";
return 0;
}