如何根据 C++ 中的给定索引对列表进行就地排序

How to do in-place sorting a list according to a given index in C++

我有一大堆对象(结构)。 它们已经排序并且索引已保存在另一个列表中。 如何根据索引进行就地排序? 例如,

FOO A[5] =[a5,a4,a8,a1,a3]
int idx[5] = [3,0,4,1,2]

预期结果:

A[5] = [a1,a5,a3,a4,a8]

由于列表A非常大,需要一种无需额外大缓冲区的就地排序方法。 我怎样才能意识到这一点?

谢谢大家

您正在寻找的是所谓的“应用排列”并且被认为是已解决的问题(幸运的是)。

Raymond 在他的博客上对此进行了有趣的讨论,并给出了一个就地解决方案 https://devblogs.microsoft.com/oldnewthing/20170102-00/?p=95095

我冒昧地调整了他的数组解决方案。您可以在他的博客中找到处理向量的原始版本。

#include <iostream>

template<typename T, size_t N>
void apply_permutation(T * v, size_t * indices)
{
    using std::swap; // to permit Koenig lookup
    for (size_t i = 0; i < N; i++) {
        auto current = i;
        while (i != indices[current]) {
            auto next = indices[current];
            swap(v[current], v[next]);
            indices[current] = current;
            current = next;
        }
        indices[current] = current;
    }
}

int main(){
    const int N = 5; 
    std::string data[N] = {"a5","a4","a8","a1","a3"};
    size_t idx[N] = {3,0,4,1,2};
    apply_permutation<std::string,N>(data, idx);

    for(auto & s : data){
        std::cout << s << std::endl;
    }
}

输出:

g++ test2.cpp && ./a.exe
a1
a5
a3
a4
a8