思路题

题意:

给 ​​1--n​​​中的数任意排列的序列,我们可以交换相连的两个数,但是我们交换的次数最多​​n-1​​次,而且每个位置只能交换一次,求这个序列最小的字典序

思路:

由于限制条件,我们最多交换​​n-1​​次,我们先从后往前交换,把交换的位置做标记,然后再从前往后交换,这样的顺序方便实现空位置的交换

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int a[maxn],vis[maxn];
int main()
{

int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
//int id=n;
//int cnt=0;
for(int i=n-1; i>=1; i--)
{
if(a[i]>a[i+1])
{
swap(a[i],a[i+1]);
vis[i]=1;
}
}
for(int i=1; i<n; i++)
{
if(!vis[i])
{
if(a[i]>a[i+1])
{
swap(a[i],a[i+1]);
}
}
}
for(int i=1; i<=n; i++)
{
if(i!=n)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
//printf("\n");
}

}