移動數據而不是交換數據的工作重新排序的版本。這個例子可能更容易解釋。每個排列都是一組「循環」。通過撤銷週期重新排序工作。假設有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