题目
题解
题目给定一个长度为 $n$ 的数组 $a$,要求我们在只能交换相邻元素的前提下将数组变为有序数组(从小到大排列),并且交换次数不能超过 $n^2$ 次,显然只要我们模拟冒泡排序的方法就可以在满足题目限制条件的情况下完成数组排序,因为冒泡排序的操作次数最大不会超过 $n ^ 2$,因此直接模拟冒泡排序过程即可,注意需要统计具体的操作内容,使用 vector 会比较方便,这里不对冒泡排序的原理再做展开,有需要的自己去了解。
C++
#include <bits/stdc++.h>
using i128 = __int128;
using ll = long long;
using ull = unsigned long long;
using de = double;
using ld = long double;
using namespace std;
void solve()
{
int n; cin >> n;
vector<int> a(n); // vector 是 C++STL 的知识点,表示动态数组
for (int i = 0; i < n; ++i) cin >> a[i];
vector<int> ans;
for (int i = 0; i < n - 1; ++i)
{
bool swapped = false;
for (int j = 0; j < n - i - 1; ++j)
{
if (a[j] > a[j + 1])
{
swapped = true;
// swap 函数的参数如果写数组并使用 [idx] 访问元素,会直接交换数组中的对应元素
swap(a[j], a[j + 1]);
ans.push_back(j + 1);
}
}
if (!swapped) break;
}
cout << ans.size() << '\n';
for (int i = 0; i < ans.size(); ++i)
{
cout << ans[i] << ' ';
}
cout << '\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
{
solve();
}
}