/*采用类似于间接排序的中间置换法思想 1.每次存储i处元素0,i为hole,然后找到i应该存储的元素p,将其移至i,然后p为hole, 然后找到p处应该存储的元素并放入p处。。。知道空洞出应该存储V[i]。 2.移动元素时需要将元素变为负值,防止已经移动的元素再次被移动。 3.接收后将每个元素改为正。 4.复杂度O(N),最多两个元素交换3次,总共最多交换3N/2 */ //获取i处应该存放的元素下标 int getposition(int i, int n) { if(i%2 == 0) return n - 1 - i / 2; else return (i + 1) / 2 - 1; } void fun(vector<int> &v) { for (int i = 0; i < v.size(); ++i) { if(v[i] < 0) continue; cout << i << endl; int p = getposition(i, v.size()); int tmp = -v[i]; int hole, nextHole = p; for (hole = i; p != i; hole = nextHole) { nextHole = p; v[hole] = -v[p]; p = getposition(p, v.size()); } v[nextHole] = tmp; //遇见首次腾出位置的元素v[i],将其放入空位 cout << v[i] << endl; } for(auto &i : v) i = -i; }