思想是这样的:对于每一个位置的数字,我们是能够知道他最终的位置,如下:
if(i<n/2)
next=2*i+1;
else
next=(n-1-i)*2;
然后从头开始找它应该待的位置,直至出现环路。整个数组可能有多个环路,所以还得记录所有数字是否已经在正确位置,题目中说都是正数,因此可以用符号位作为标志位,最后再变回来即可。代码如下:
#include <iostream>
#include <vector>
using namespace std;
void reorder(vector<int> & num){
int temp,pre,i,n=num.size(),next;
for(i=0;i<n;i++){
if(num[i]<0)
continue;
else{
temp=num[i];
pre=num[i];
if(i<n/2)
next=2*i+1;
else
next=(n-1-i)*2;
while(next!=i){
temp=num[next];
num[next]=-pre;
pre=temp;
if(next<n/2)
next=2*next+1;
else
next=(n-1-next)*2;
}
num[next]=-pre;
}
}
for(i=0;i<n;i++)
num[i]=-num[i];
}
int main() {
vector<int> tmp;
for(int i=10;i>=1;i--)
tmp.push_back(i);
reorder(tmp);
for(int i=0;i<10;i++)
cout<<tmp[i]<<" ";
return 0;
}