从后往前找非递减的数,为k
将其与后面递减序列最小的大于其的数交换
将后面的序列从小到大排序
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
int a[10100];
int main()
{
cin>>n;
int num;
cin>>num;
for(int i=0; i<n; i++)
cin>>a[i];
while(num--){
int k=n-1;//从后往前找a[k-1]<a[k]
while(a[k-1]>a[k]) k--;
k--;//到k-1
int t=k;
while(t+1<n&&a[t+1]>a[k]) t++;
swap(a[t],a[k]);
reverse(a+k+1,a+n);
}
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
return 0;
}