思路:如图
其他的以此类推,不断排序,就好像冒泡排序一样,主要是几个起始索引,数组交换的细节,不小心就会崩。
代码(可参考性不高,索引的取值靠自己,思路有了就没什么太大难度了)
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> v;
void myswap(int begin, int end) {//交换长度为偶数的数组
int m = begin + (end - begin) / 2;
for (int i = begin; i <= m; i++) {
int tmp = v[i];
v[i] = v[m + 1 + i - begin];
v[m + 1 + i - begin]=tmp;
}
}
void ss(int n) {
for (int i=1; i < n; i ++ ) {
for (int j = 0; j < n; j++) {
if (v[j] == i) {
if (j > (n - i + 1) / 2+i-1) {//如果不能一步到位就先换入前半段
if ((n - i + 1) % 2 == 0) {
myswap(i-1,n-1);
myswap(i - 1, 2*j-n-1);
}
else
{
myswap(i, n - 1);
myswap(i - 1, 2 * j - n);
}
}
else
{
myswap(i - 1, 2*j - i );
}
}
}
}
}
int main(void){
int n;
cin >> n;
int t = n;
while (t--) {
int m;
cin >> m;
v.push_back(m);
}
ss(n);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
system("pause");
}