移动数据而不是交换数据的工作重新排序的版本。这个例子可能更容易解释。每个排列都是一组“循环”。通过撤销周期重新排序工作。假设有8个元素,并且vI包含所需的顺序。我把我的索引以上VI:
i : { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 }
vI[i] = { 5 , 7 , 0 , 3 , 6 , 2 , 4 , 1 }
周期1:VI [0] == 5,VI [5] == 2,VI [2] == 0
周期2:六[1] == 7,VI [7] == 1
循环3:VI [3] == 3.
循环4:VI [4] == 6,VI [6] = = 0
撤销循环1,t = vA [0],vA [0] = vA [5],vA [5] = vA [2],vA [2] = t。
撤消循环2,t = vA [1],vA [1] = vA [7],vA [7] = t。
撤消周期3,不进行校正所需
撤消周期4,T = vA型[4],VA [4] = vA型[6],VA [6] =吨。
每次将值存储在vA [k]中时,vI [k]被设置为k以指示vA [k]被排序。
template <class T>
void reorder(vector<T>& vA, vector<size_t>& vI)
{
size_t i, j, k;
T t;
for(i = 0; i < vA.size(); i++){
if(i != vI[i]){
t = vA[i];
k = i;
while(i != (j = vI[k])){
// every move places a value in it's final location
vA[k] = vA[j];
vI[k] = k;
k = j;
}
vA[k] = t;
vI[k] = k;
}
}
}
我认为你正在努力做'收集'功能。如果你想要它已经在boost库中实现(boost/algorithm/gather.hpp)http://www.boost.org/doc/libs/1_41_0/doc/html/boost/mpi/gather.html – Vladp
这里的目标是将重新排序。制作一个有序的副本很简单:for(i = 0; i
rcgldr
我更新了这个问题,以包含前一个问题的链接。 – rcgldr