1.冒泡,依次选1-n
2.先把当前选择的数 放在前半部分(保证下一步能把当前数放在前面)
每个数最多2个操作
#include <iostream> #include <istream> #include <sstream> #include <vector> #include <stack> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <cstring> #include <unordered_map> #include <unordered_set> #include <algorithm> #include <numeric> #include <chrono> #include <ctime> #include <cmath> #include <cctype> #include <string> #include <cstdio> #include <iomanip> #include <thread> #include <mutex> #include <condition_variable> #include <functional> #include <iterator> using namespace std; const int maxn = 1e5 + 7; int input[maxn],n,ans[maxn<<1],cnt; void SwapArr(int first, int last) { if (first >= last) return; int* fp = input + first, * lp = input + (first + last >> 1) + 1,*over = lp; while (fp != over) { swap(*fp++, *lp++); } ans[cnt++] = first; ans[cnt++] = last; } void GetResult(int first, int last) { while (first <= last && input[first] == first) ++first; if (first > last) return; int index = find(input + first, input + last + 1,first) - input,len = index - first; if (index > (first + last >> 1)) { int tcnt = index - first + 1,tFirst = first; if (tcnt & 1) tFirst++; SwapArr(tFirst, index); len = find(input + first, input + last + 1, first) - input; len -= first; } SwapArr(first, first + len * 2 - 1); GetResult(first + 1, last); } int main() { int t; cin >> t; while (t--) { cin >> n, cnt = 0; for (int i = 1; i <= n; i++)cin >> input[i]; GetResult(1, n); cout << (cnt >> 1) << endl; for (int i = 0; i < cnt; i+=2) { cout << ans[i] << " " << ans[i + 1] << endl; } } return 0; }