给定数组:
int data[5] = {data[0],data[1],data[2],data[3],data[4]}
...和另一个带索引的数组:
int idx[5] = {3,1,0,2,4}
重新排列data[5]
数组的最快方法是什么,以便生成(排序)数组:
data[5] = {data[3],data[1],data[0],data[2],data[4]}
答案 0 :(得分:0)
根据索引成对地对数组进行排序:对于您在引用数组中执行的任何比较和重新排序操作,请移动另一个数组中的相应索引。
答案 1 :(得分:0)
您只需使用temp
数组并使用idx
的数据填入data
的订单
int temp[5];
for(int i = 0 ; i< 5 ; i++){
temp[i] = data[idx[i]];
}
答案 2 :(得分:0)
你的意思是就地重排吗?
int idx[5] = {3,1,0,2,4}
int idx2[5];
for (int i = 0; i < 5; ++i) {
idx2[idx[i]] = i;
}
// we have array int idx2[5] = {2,1,3,0,4}
for (int i = 0; i < 5; ++i) {
if (i == idx[i]) continue;
std::swap(data[i], data[idx[i]]);
idx[idx2[idx[i]]] = i; // Update indices list
}
答案 3 :(得分:0)
恕我直言,最简单快捷的方法是使用相同大小的临时数组,保存数据,然后使用适当的索引重置数据。
for (i=0; i<5; i++) {
sv_data[i] = data[i];
}
for (i=0; i<5; i++) {
data[i] = sv_data[idx[i]];
}
答案 4 :(得分:0)
以下代码不最快。 然而,空间复杂度 O (1)。
data[]
(c, b, d, a, e)
(_, b, d, a, e) {c}
(a, b, d, _, e) {c}
(a, b, _, d, e) {c}
(a, b, c, d, e)
重新排列如下。
temp
其中,{}是idx[]
{{1}}最后重新排列为(0,1,2,3,4)。