如何用c ++中的另一个索引数组重新排列数组

时间:2015-05-12 11:12:51

标签: c++ algorithm sorting

给定数组:

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]}

5 个答案:

答案 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)。